点击跳转
《Python入门系列目录》
1. 面向对象概述
- 属性:对象的静态特征
- 方法:对象的动态特征
- 对象 = 属性 + 方法
- Python既可以面向过程也可以面向对象
- 在程序中使用对象来映射现实中的事物,使用对象间的关系来描述事物之间的联系,这种思想就是面向对象
- 面向过程(procedure-oriented):一种以事件为中心的编程思想
- 面向对象(object-oriented):一种以事物为中心的编程思想
- 如果有新功能要添加的时候,面向对象更简便
- Python中对象的概念很广泛,Python中一切内容都可以称为对象,除了数字、字符串、列表、元组、字典、集合、range对象、zip对象等,函数也是对象,类也是对象
- 创建类时,用变量形式表示的对象属性称为数据成员,用函数形式表示的对象行为称为成员方法。成员属性和成员方法统称为类的成员
2. 类与对象
2.1 类与对象的关系
- 面向对象有两个非常重要的概念:类与对象
- 对象是面向对象编程的核心
- 具有相似特征和行为的事物的集合统称为类
- 对象是根据类创建的,一个类可以对应多个对象
2.2 创建类
-
执行完class类的整段代码以后,这个类才能生效
-
类的定义
-
class 类名: 类的属性 类的方法
-
-
根据类创建对象的语法格式
- 对象名 = 类名()
-
要想给对象添加属性
- 对象名.新的属性名 = 值
-
# 一次模拟猫咪的尝试 class Cat: name = 'maomi' # 属性 age = 3 # 属性 # 猫咪睡觉 def sleep(self): # 方法 print('%d岁的%s正在沙发上睡懒觉'%(self.age, self.name)) # 猫咪吃东西 def eat(self, food): # 方法 self.food = food print("%d岁的%s在吃%s" %(self.age, self.name, self.food))
-
类命名惯例
- 首字母大写
- 两个单词可以写成HotDog
2.3 绑定self
-
在方法的列表中,第1个参数永远是self
-
self的字面意思是自己,可以当作C++中的this指针,表示对象自身
-
在类的实例方法中访问实例属性时需要以self为前缀
-
当某个对象调用方法的时候,Python解释器会把这个对象作为第1个参数自动传给self,开发者只需要传递后面的参数就可以了
-
如果在外部通过类名调用对象方法,则需要显式为self参数传值
-
self代表当前对象的地址,能避免非限定调用时找不到访问对象或变量
-
self名称不是必需的,它并不是关键词
class Test: def prt(my_address): # 第一个参数其实就是self print(my_address) # 打印自己,打印的是地址 print(my_address.__class__) # 打印当前实例的类 t = Test() # self指的是这个t t.prt()
class Dog: def setOwner(self,name): # 方法1:设置对象的主人姓名 self.owner=name def getOwner(self): # 方法2:获取对象的主人姓名 print('我的主人是:%s'%self.owner) def run(self): # 方法3 pass # 关键字,空语句,保持程序结构完整性 a = Dog() # 创建了小狗对象a a.setOwner("小红") # 小红认领了小狗a b = Dog() # 创建了小狗对象b b.setOwner("兰兰") # 兰兰认领了小狗b a.getOwner() # 我的主人是:小红 b.getOwner() # 我的主人是:兰兰
2.4 类的专有方法
- 用dir()可以查看类的专有方法
- 通常用双下划线__开头和结尾
- 访问类或对象的属性和方法,通过点号
- object.attribute
- 可以对属性进行修改和增加
2.5 创建对象
-
类的实例化,创建的对象称为实例对象
-
Python类的构造函数
- _init_()
- 一般用来为数据成员设置初值或进行其他必要的初始化工作
- 在创建对象时被自动调用和执行
- 如果用户没有设计构造函数,Python将提供一个默认的构造函数用来进行必要的初始化工作
# 模拟猫咪的尝试 class Cat: # 构造器方法 def __init__(self, name, age): self.name = name self.age = age # 猫咪睡觉 def sleep(self): print('%d岁的%s正在沙发上睡懒觉'%(self.age, self.name)) # 猫咪吃东西 def eat(self, food): self.food = food print("%d岁的%s在吃%s" % (self.age, self.name, self.food))
2.6 删除对象
- Python中类的析构函数
- _del_()
- 一般用来释放对象占用的资源
- 在Python删除对象和收回对象空间时被自动调用和执行
- 如果用户没有编写析构函数,Python将提供一个默认的析构函数进行必要的清理工作
class Animal:
# 构造方法
def __init__(self):
print('---构造方法被调用---')
# 析构方法
def __del__(self):
print('---析构方法被调用---')
cat = Animal()
print(cat)
del cat
print(cat) # 出错
class Cat:
# 构造器方法
def __init__(self, name, age):
self.name = name
self.age = age
def sleep(self):
print('%d岁的%s正在沙发上睡懒觉'%(self.age, self.name))
def eat(self, food):
self.food = food
print("%d岁的%s在吃%s" %(self.age,self.name, self.food))
cat1 = Cat('Tom', 3)
cat2 = Cat('Jack', 4)
print('Cat1的名字为:', cat1.name)
print('Cat2的名字为', cat2.name)
print(cat1.sleep())
print(cat2.eat('fish'))
# print()函数需要有返回值,但是这里两个都没有返回值,所以会多返回两个None
2.7 对象的方法
- 方法引用
- 在创建具体实例对象时,程序才会为对象的每个数据属性和方法分配内存
- 对象名.成员
cat1 = Cat('Tom', 3)
cat2 = Cat('Jack', 4)
print('Cat1的名字为:', cat1.name)
print('Cat2的名字为:', cat2.name)
print(cat1.sleep())
print(cat2.eat('fish'))
cat1 = Cat('Tom', 3)
sleep = cat1.sleep
print(sleep())
cat2 = Cat('Jack', 4)
eat = cat2.eat
print(eat('fish'))
2.8 公有和私有
-
私有:只公开结果
- C++用private和public进行区分
-
Python并没有对私有成员提供严格的访问保护机制
-
定义类成员时,如果成员名以两个或多个下划线开头,但不以两个或多个下划线结束,即前后下划线数量不同,则表示私有成员
-
私有成员在类的外部不能直接访问,需要通过调用对象的公开成员方法来访问,也可以通过Python支持的特殊方式来访问
-
-
公有成员既可以在类的内部进行访问,也可以在外部程序中使用
-
公有属性
- 可以通过“对象名.成员”的方法来访问
class Dog: name = '大黄' # 属性 mydog=Dog() print(mydog.name) # 大黄
-
私有属性
- Python定义私有类型的方式很简单,只需在变量名前面加上两个下划线
class Dog: __name = '大黄' # 私有属性
-
访问私有属性
- 在类的外部不能直接访问,可以利用类内部的方法,通过“self.私有成员”进行访问
class Dog: __name = '大黄' # 私有属性 def getName(self): # 方法:获取私有属性值 return self.__name mydog = Dog() print(mydog.getName()) # 大黄
-
私有方法
- 私有方法与私有属性类似,它的名字也是以两个下划线开始,可以在类的内部通过“self.私有成员”来访问
class Dog: __age = 1 def getAge(self): return self.__age def __changeAge(self, age): # 私有方法 self.__age = age def needChange(self, age): if type(age) == int: self.__changeAge(age) else: print("年龄更改不合法") mydog = Dog() print(mydog.getAge()) # 小狗的年龄为1 mydog.needChange("毛毛") # 年龄更改不合法 print(mydog.getAge()) # 小狗的年龄为1