一、@property 属性装饰器
1. 作用
把方法伪装成属性调用:
2. 基础 @property 只读
把方法变成只读属性,只能取值,不能赋值。
classPerson:
def__init__(self, age):
self.__age = age # 私有属性
@property
defage(self):
# 读取私有属性
returnself.__age
p = Person(18)
print(p.age) # 像属性一样调用,不用 ()
# p.age = 20 # 报错,只读不能赋值
二、@age.setter 赋值装饰器
给 property 增加赋值权限,可以做数据校验。
语法:@属性名.setter
classPerson:
def__init__(self, age):
self.__age = age
@property
defage(self):
returnself.__age
@age.setter
defage(self, value):
# 赋值时做校验
if0 < value < 150:
self.__age = value
else:
print("年龄不合法")
p = Person(18)
print(p.age)
p.age = 25# 触发 setter
print(p.age)
p.age = 200# 校验不通过
三、@age.deleter 删除装饰器
控制删除属性时的行为。
classPerson:
def__init__(self, age):
self.__age = age
@property
defage(self):
returnself.__age
@age.deleter
defage(self):
print("删除年龄属性")
delself.__age
p = Person(18)
del p.age # 触发 deleter
四、property 三者完整结构
classPerson:
def__init__(self, age):
self.__age = age
# 读
@property
defage(self):
returnself.__age
# 写
@age.setter
defage(self, val):
self.__age = val
# 删
@age.deleter
defage(self):
delself.__age
记忆:
@property 读、@setter 写、@deleter 删
五、面向对象 继承
1. 继承概念
2. 单继承语法
class父类:
pass
class子类(父类):
pass
单继承示例
# 父类
classAnimal:
defeat(self):
print("动物会吃东西")
# 子类
classDog(Animal):
defbark(self):
print("狗会汪汪叫")
d = Dog()
d.eat() # 继承父类方法
d.bark() # 自己独有方法
六、方法重写(覆盖)
子类和父类同名方法,子类会覆盖父类。
classAnimal:
defeat(self):
print("动物吃东西")
classCat(Animal):
# 重写父类方法
defeat(self):
print("猫吃鱼")
c = Cat()
c.eat() # 执行子类重写的方法
七、super() 调用父类方法
子类重写后,还想保留父类原有逻辑,用 super()
classAnimal:
defeat(self):
print("动物吃东西")
classDog(Animal):
defeat(self):
super().eat() # 调用父类 eat
print("狗吃狗粮")
d = Dog()
d.eat()
八、多继承
1. 语法
一个子类同时继承多个父类
class父类1:
pass
class父类2:
pass
class子类(父类1, 父类2):
pass
2. 多继承示例
classA:
deffunA(self):
print("A 方法")
classB:
deffunB(self):
print("B 方法")
classC(A, B):
pass
c = C()
c.funA()
c.funB()
3. 多继承注意:MRO 继承顺序
当多个父类有同名方法,按继承顺序从左到右查找。
九、核心总结速记
属性装饰器
继承