采用读写属性的目的就是把录入的数据控制在合理区间。
如:学生的年龄(age),学生的身高(height)...
方法一:利用实例方法来控制
class Student:
def __init__(self,name="",age=0):
self.name = name
self.set_age(age)
def set_age(self,value):
if value > 30:
value = 30
elif value < 20:
value = 20
self.__age = value
def get_age(self):
return self.__age
s = 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 = brand
self.speed = speed
class ElectricCar(Car):
def __init__(self, brand="", speed=0,capacity=0,power=0) -> None:
super().__init__(brand, speed)
self.capacity = capacity
self.power = power
def __str__(self):
return f"{self.brand}的速度是{self.speed},电池容量是{self.capacity},充电功率是{self.power}"
@property
def speed(self):
return self.__speed
@speed.setter
def speed(self,value):
if value > 120:
value = 120
elif value < 0:
value = 0
self.__speed = value
@property
def power(self):
return self.__power
@power.setter
def power(self,value):
if value > 220:
value = 220
elif value < 180:
value = 180
self.__power = value
# ---------- 测试用例 -----------------
car1 = ElectricCar("欧派",1200,200,50)
print(car1)
car2 = ElectricCar("爱玛",25,200,50)
print(car2)