0 ⽬标
⾯向对象三⼤特性
类属性和实例属性
类⽅法和静态⽅法
⼀. ⾯向对象三⼤特性
封装
将属性和⽅法书写到类的⾥⾯的操作即为封装
封装可以为属性和⽅法添加私有权限
继承
⼦类默认继承⽗类的所有属性和⽅法
⼦类可以重写⽗类属性和⽅法
多态
传⼊不同的对象,产⽣不同的结果
⼆. 多态
2.1 了解多态
多态指的是⼀类事物有多种形态,(⼀个抽象类有多个⼦类,因⽽多态的概念依赖于继承)。
定义:多态是⼀种使⽤对象的⽅式,⼦类重写⽗类⽅法,调⽤不同⼦类对象的相同⽗类⽅法,可以
产⽣不同的执⾏结果
好处:调⽤灵活,有了多态,更容易编写出通⽤的代码,做出通⽤的编程,以适应需求的不断变
化!
实现步骤:
定义⽗类,并提供公共⽅法
定义⼦类,并重写⽗类⽅法
传递⼦类对象给调⽤者,可以看到不同⼦类执⾏效果不同
2.2 体验多态
# 需求:警务人员和警犬一起工作,警犬分2种:追击敌人和追查毒品,携带不同的警犬,执行不同的工作 # 1. 定义父类,提供公共方法: 警犬 和 人 class Dog(object): def work(self): pass # 2. 定义子类,子类重写父类方法:定义2个类表示不同的警犬 class ArmyDog(Dog): def work(self): print('追击敌人...') class DrugDog(Dog): def work(self): print('追查毒品...') # 定义人类 class Person(object): def work_with_dog(self, dog): dog.work() # 3. 创建对象,调用不同的功能,传入不同的对象,观察执行的结果 ad = ArmyDog() dd = DrugDog() daqiu = Person() daqiu.work_with_dog(ad) daqiu.work_with_dog(dd)
三. 类属性和实例属性
3.1 类属性
3.1.1 设置和访问类属性
类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有。
类属性可以使⽤ 类对象 或 实例对象 访问。
# 1. 定义类,定义类属性 class Dog(object): tooth = 10 # 2. 创建对象 wangcai = Dog() xiaohei = Dog() # 3. 访问类属性: 类和对象 print(Dog.tooth) print(wangcai.tooth) print(xiaohei.tooth)
类属性的优点
记录的某项数据 始终保持⼀致时,则定义类属性。
实例属性 要求 每个对象 为其 单独开辟⼀份内存空间 来记录数据,⽽ 类属性 为全类所共有
,仅占⽤⼀份内存,更加节省内存空间。
3.1.2 修改类属性
类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了⼀个实例属性。
class Dog(object): tooth = 10 wangcai = Dog() xiaohei = Dog() # 1. 类 类.类属性 = 值 # Dog.tooth = 20 # print(Dog.tooth) # print(wangcai.tooth) # print(xiaohei.tooth) # 2. 测试通过对象修改类属性 wangcai.tooth = 200 print(Dog.tooth) # 10 print(wangcai.tooth) # 200 print(xiaohei.tooth) # 10
3.2 实例属性
class Dog(object): def __init__(self): self.age = 5 def info_print(self): print(self.age) wangcai = Dog() print(wangcai.age) # 5 # print(Dog.age) # 报错:实例属性不能通过类访问 wangcai.info_print() # 5
四. 类⽅法和静态⽅法
4.1 类⽅法
4.1.1 类⽅法特点
需要⽤装饰器 @classmethod 来标识其为类⽅法,对于类⽅法,第⼀个参数必须是类对象,⼀般以
cls 作为第⼀个参数。
4.1.2 类⽅法使⽤场景
当⽅法中 需要使⽤类对象 (如访问私有类属性等)时,定义类⽅法
类⽅法⼀般和类属性配合使⽤
# 1. 定义类:私有类属性,类方法获取这个私有类属性 class Dog(object): __tooth = 10 # 定义类方法 @classmethod def get_tooth(cls): return cls.__tooth # 2. 创建对象,调用类方法 wangcai = Dog() result = wangcai.get_tooth() print(result)
# 1. 定义类,定义静态方法 class Dog(object): @staticmethod def info_print(): print('这是一个静态方法') # 2. 创建对象 wangcai = Dog() # 3. 调用静态方法:类 和 对象 wangcai.info_print() Dog.info_print()