面向对象编程 Object-Oriented Programing
今天相关的名词:
类, 对象,实例, 实例方法, 实例属性,初始化方法,析构方法
什么是对象:
对象是指现实中的物体或实体
面向对象
是把一切看成对象(实例), 用各种对象之间的关系来描述事务
对象有什么特征:
对象有很多属性(名词,形容词)
姓名,年龄,性别,肤色
对象有很多行为(动作,动词)
学习,吃饭,睡觉,踢球
什么是类
拥有相同属性和行为的对象分为一组即为一个类
类是用来描述对象的工具,用类可以创建
此类的对象(实例)

示意: 车(类) ---> BYD 秦 京A.89898 实例 --> BMW X5 京B.00000 实例 狗(类) ---> 京巴(户籍:00001) ---> 导盲犬(户籍:00002) int(类) ---> 100(对象,实例) .--> 200(对象,实例)
类的创建语句 class 语句
语法:
class 类名(继承列表):
'类的文档字符串'
实例方法
类变量
类方法(@classmethod)
静态方法(@staticmethod)
作用:
创建一个类
类用于描述对象的行为和属性
类用于创建此类的一个或多个对象(实例)
说明:
继承列表可以省略
构造函数
构造函数调用表达式
类名([创建传参列表])
作用:
创建这个类的实例对象,并返回此实例对象的引用关系

# 此示例示意用类来创建实例对象 class Dog: # 创建类 pass dog1 = Dog() # 创建一个Dog类的实例 print("dog1的id是", id(dog1)) dog2 = Dog() print("dog2的id是", id(dog2)) lst1 = list() print('lst1的id是', id(lst1)) lst2 = list() print('lst2的id是', id(lst2))
实例方法(instance method)
语法:
class 类名(继承列表):
def 实例方法名(self, 参数列表):
'方法的文档字符串'
语句块
作用:
用于描述一个对象的行为,让此类型的全部对象都拥有相同的行为
说明:
实例方法的实质是函数,是定义在类内的函数
实例方法至少有一个形参,第一个形参绑定调用这个方法的实例,一般命名为'self'
实例方法的调用语法:
实例.实例方法名(调用传参)
或
类名.实例方法名(实例,调用传参)

class Dog: def eat(self, food): print("ID为", id(self),"的小狗正在吃", food) def sleep(self, hour): print("ID为", id(self),'的小狗睡了', hour,'小时') dog1 = Dog() dog1.eat('骨头') dog2 = Dog() dog2.eat('狗粮') dog2.sleep(3) dog1.sleep(1) # 类名.实例方法名(实例,调用传参) Dog.sleep(dog1, 1)
实例属性(也叫实例变量) attribute
语法:
实例.属性名
赋值规则
首次为属性赋值则创建此属性
再次为属性赋值则改变属性的绑定关系
作用:
记录每个对象自身的数据

# 此示例示意属性的创建的使用 class Dog: pass dog1 = Dog() dog1.kinds = '哈士奇' dog1.color = '黑白色' # 创建属性 print(dog1.color, '的', dog1.kinds) dog1.color = '黄色' # 修改属性 print(dog1.color, '的', dog1.kinds) dog2 = Dog() dog2.kinds = '京巴' dog2.color = '白色' print(dog2.color, '的', dog2.kinds)
删除实例属性
语法:
del 对象.实例属性名

如: class Dog: pass dog1 = Dog() dog1.color = '白色' print(dog1.color) # 白色 del dog1.color print(dog1.color) # AttributeError
初始化方法
作用:
对新创建的对象添加属性
格式:
class 类名(继承列表):
def __init__(self [, 形参列表]):
语句块
注: [] 代表其中的内容可省略
说明:
初始化方法名必须为__init__ 不可改变
初始化方法会在构造函数创建实例后自动调用,且将实例自身通过第一个参数self传入__init__方法
构造函数的实参将通过__init__方法的参数列表传入到__init__方法
初始化方法内如果需要return语句返回,则必须返回None

# 此示例示意初始化方法的定义语法和用法 class Car: '''此类为小汽车类''' def __init__(self, c, b, m): self.color = c # 颜色 self.brand = b # 品牌 self.model = m # 型号 print('Car类的__init__被调用') def run(self, speed): print(self.color, '的',self.brand, self.model,'正在以', speed,'公里/小时的速度行驶') c1 = Car('红色', '奥迪', 'A4') c1.run(299) c2 = Car('白色', 'BYD', '秦EV Pro') c2.run(119)
析构方法
del __del__(self):
...
析构方法在对象被销毁前被自动调用
python语言不建议在对象销毁时做任何事情,因为销毁的时间难以确定

# 此示例示意析构方法的定义方式和用法 class Car: def __init__(self, info): self.info = info self.file = open('mydel.txt','w') print("汽车", self.info, '被创建') def __del__(self): # 析构方法 print('汽车', self.info, '被销毁') self.file.close() # 关闭文件 c1 = Car('BYD E6') del c1 input('请输入回车键继续:') print("程序退出")
预置实例属性
__dict__属性
__dict__属性绑定一个存储此实例自身属性的字典

示例: class Dog: pass dog1 = Dog() print(dog1.__dict__) # {} dog1.color = '白色' print(dog1.__dict__) #{'color':'白色'}
__class__属性
__class__属性绑定创建此实例的类
作用:
可以借助于此属性来访问创建此实例的类

# 此示例示意 __class__属性的作用 class Dog: pass dog1 = Dog() print(dog1.__class__) # __class__绑定Dog类 print(Dog) # 等同于上句 dog2 = dog1.__class__() # 等同于dog2=Dog()
用于类的函数:
isinstance(obj, class_or_tuple) 返回这个对象obj是否是某个类的对象或某些类中一个类的对象,如果是则返回True,否则返回False
type(obj) 返回对象的类