一、面向对象三大特性
二、多态
定义:多态是⼀种使⽤对象的⽅式,⼦类重写⽗类⽅法,调⽤不同⼦类对象的相同⽗类⽅法,可以产⽣不同的执⾏结果。
一个父类,可以继承给多个子类,每个不同的子类可以创建多个对象,每个对象可以调用父类之父类的方法,产生不同的执行结果。
# 犬与人协同工作,人协同不同的犬执行不同的任务
class Dog:
def work(self): # ⽗类提供统⼀的⽅法,哪怕是空⽅法
print("指哪打哪")
class ArmyDog(Dog): # 继承Dog类
def work(self): # ⼦类重写⽗类同名⽅法
print("追击敌人")
class DrugDog(Dog):
def work(self): # ⼦类重写⽗类同名⽅法
print("追查毒品")
class Person:
def work_with_dog(self, dogtype): # 传⼊不同的对象,执⾏不同的代码,即不同的work函数
dogtype.work()
ad = ArmyDog()
dd = DrugDog()
p1 = Person()
ad.work() # 追击敌人
p1.work_with_dog(ad) # 追击敌人
p1.work_with_dog(dd) # 追查毒品
三、设置和访问类属性
- 类属性就是类对象所拥有的属性,类属性被该类的所有实例对象所共有。
- 类属性可以用类对象访问,也可以用实例对象访问。
class Dog:
age = 3
wangcai = Dog()
xiaohei = Dog()
print(Dog.age) # 通过类访问类属性
print(wangcai.age) # 通过对象访问类属性
print(xiaohei.age) # 通过对象访问类属性
输出:
3
3
3
四、修改类属性
类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了⼀个实例属性。
class Dog:
age = 3
wangcai = Dog()
xiaohei = Dog()
Dog.age = 10 # 通过类修改类属性
print(Dog.age) # 10 通过类访问类属性
print(wangcai.age) # 10 通过对象访问类属性
print(xiaohei.age) # 10 通过对象访问类属性
class Dog:
age = 3
wangcai = Dog()
xiaohei = Dog()
wangcai.age = 20 # 通过对象修改类属性,实际并未修改类属性,而是创建了一个同名实例属性
print(Dog.age) # 3 通过类访问类属性
print(wangcai.age) # 20 通过对象访问类属性
print(xiaohei.age) # 3 通过对象访问类属性
五、实例属性
实例属性不能通过类访问。
- 每个对象的每个属性都会单独占用一份内存空间,如果定义大量实例属性,会耗费内存。
- 对一些数值不会变化的属性,可以定义为类属性,类属性共享一份内存,可以减少内存消耗。
- 如果连参数传递都不需要,可以定义静态方法,更加减少内存消耗。
class Dog:
def __init__(self):
self.age = 5
def printinfo(self):
print(self.age)
wangcai = Dog()
print(wangcai.age) # 对象访问实例属性
wangcai.printinfo() # 对象访问实例方法
print(Dog.age) # 报错:实例属性不能通过类访问
六、类方法
1、类⽅法特点
- 第⼀个形参是类对象的⽅法
- 需要⽤装饰器 @classmethod 标识其为类⽅法,对于类⽅法,第⼀个参数必须是类对象,⼀般以cls 作为第⼀个参数,cls代表这个类。
@classmethod,标识某一个函数为类方法
`
2、类方法使用场景
- 当方法中需要使用类对象时 (如访问私有类属性等),定义类⽅法
- 类方法⼀般和类属性配合使⽤
class Dog:
__age = 3 # 添加私有类属性,两道下划线.属性名=属性值
@classmethod # 定义类方法
def get_age(cls): # 形参cls代表Dog类(在实例属性里用形参self代表实例对象)
return cls.__age # 访问类属性的值
wangcai = Dog()
result = wangcai.get_age() # 对象调用类方法
print(result) # 3
print(Dog.get_age()) # 3 类调用类方法
七、静态方法
1、静态方法的特点
- 需要通过装饰器 @staticmethod来进⾏修饰,静态方法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)。
- 静态方法既可以使用对象访问又可以使用类访问。
2、静态方法使用场景
- 当⽅法中 既不需要使⽤实例对象(如实例对象,实例属性),也不需要使⽤类对象 (如类属性、类⽅法、创建实例等)时,可以定义静态⽅法
- 取消不需要的参数传递,有利于减少不必要的内存占用和性能消耗
class Dog:
@staticmethod
def printinfo():
print("这是一个犬类,用于创建犬实例……")
wangcai = Dog()
wangcai.printinfo() # 通过对象调用类方法
Dog.printinfo() # 通过类调用类方法
输出:
这是一个犬类,用于创建犬实例……
这是一个犬类,用于创建犬实例……
八、小结
PS: source,itheima