采用读写属性的目的就是把录入的数据控制在合理区间。
如:学生的年龄(age),学生的身高(height)...
方法一:利用实例方法来控制
class Student:def __init__(self,name="",age=0):self.name = nameself.set_age(age)def set_age(self,value):if value > 30:value = 30elif value < 20:value = 20self.__age = valuedef get_age(self):return self.__ages = Student("张三",25)
s.name = "王五"
# 下面的传参和调用是错误的
# 这种方式相当于为 s 对象新创建了一个age实例变量并赋值,并不是类中的age实例变量
# s.age = 102
# print(s.name,s.age)
s.set_age(200)
print(s.name,s.get_age())
方法二:利用属性来控制
Python内置的
@property
装饰器就是负责把一个方法变成属性调用的
# 在继承关系中体会属性和内置可重写函数
# -- 限制速度和充电功率的取值范围
# -- 直接打印对象,格式如下:
# xx的速度是xx
# xx的速度是xx,电池容量是xx,充电功率是xx
# 父类:车(品牌,速度)
# 0-120
# 创建子类:电动车(电池容量,充电功率)
# 180-220
class Car:def __init__(self,brand="",speed=0):self.brand = brandself.speed = speedclass ElectricCar(Car):def __init__(self, brand="", speed=0,capacity=0,power=0) -> None:super().__init__(brand, speed)self.capacity = capacityself.power = powerdef __str__(self):return f"{self.brand}的速度是{self.speed},电池容量是{self.capacity},充电功率是{self.power}"@propertydef speed(self):return self.__speed@speed.setterdef speed(self,value):if value > 120:value = 120elif value < 0:value = 0self.__speed = value@propertydef power(self):return self.__power@power.setterdef power(self,value):if value > 220:value = 220elif value < 180:value = 180self.__power = value# ---------- 测试用例 -----------------
car1 = ElectricCar("欧派",1200,200,50)
print(car1)
car2 = ElectricCar("爱玛",25,200,50)
print(car2)