class Person: is_good_person = True # 类属性(优先找实例变量),虽然跟默认参数(__init__(self, name, sex, is_good_person = True))效果一样,但是更省内存 def __init__(self, name, sex): self.name = name # 实例属性(静态属性),作用域是实例本身 self.sex = sex def speak(self): # 类方法(动态属性) print(666)
__init__ 构造函数:在实例化的时候做一些类初始化的工作
__del__ 析构函数:在实例释放、销毁的时候(删除实例或者程序退出)自动执行的,通常用于做一些收尾工作,如关闭一些数据库连接,关闭打开的临时文件
vivi = Person('weiwei', 'girl')print(vivi.is_good_person)vivi.best_friend = 'Allen'# 虽然类本身没有这个属性,但这句话就相当于 self.best_friend = 'Allen',原因:# vivi = Person('weiwei', 'girl') 相当于 Person(vivi, 'weiwei', 'girl')# 所以类里面的 self.name = name 相当于 vivi.name = name# 同理 vivi.best_friend = 'Allen' 是有效的del vivi.best_friend # 删除实例变量
私有属性,私有方法:只有内部才能访问的属性,方法,在属性名或方法名前面加两个下划线__
类的继承
class Hero(Person): # 继承Person类 def speak(self): # 重构父类的speak方法 Person.speak(self) print("{} is hero!".format(self.name))me = Hero('Allen', 25)me.speak()# 输出# 666# Allen is hero!
经典类与新式类
class Person: # 经典类class Person(object): # 新式类Person.__init__(name, age) # 经典类调用父类方法super(Hero, self).__init__(name, age) #新式类调用父类方法
多继承的顺序是从左至右继承,实例化时会找到第一个构造函数执行,而不会执行每一个构造函数。
规则:
Python2 经典类是按深度优先来继承,新式类是由广度优先来继承;
Python3 经典类和新式类都是按照广度优先来继承。
多态
一个接口,多种实现(作用:接口重用)。
class Person(object): @staticmethod def person_speak(obj): obj.speak()class Hero(Person): def speak(self): print("I'm hero")class Badperson(Person): def speak(self): print("I'm bad person")h = Hero()b = Badperson()Person.person_speak(h)Person.person_speak(b) # 一个接口,多种实现 # 输出 # I'm hero # I'm bad person