@SuHongjun
2020-06-01T16:26:11.000000Z
字数 1871
阅读 176
Python 2020春季学期
#只读属性class Person(object):def __init__(self,name,birth,gender='unknown'):self.name = nameself._birth = birthself.gender = gender@property #定义了一个只读属性 agedef age(self): #只能有一个self参数return 2020 - self._birthJack = Person('Jack',1995)print(Jack.age)#输出25
property属性的定义和调用要注意一下几点:
1. 定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数
2. 调用时,无需括号
class Person(object):@propertydef birth(self): #可读写属性return self._birth@birth.setter #可写属性, @property创建出来的装饰器def birth(self, value):self._birth = value@propertydef age(self): #只读属性return 2015 - self._birth>>> Jack = Person()>>> Jack.birth = 1998>>> Jack.age17
#新式类中的property有三种访问方式,并分别对应了三个被 @property、@方法名.setter、@方法名.deleter 修饰的方法class Goods(object):def __init__(self):# 原价self.original_price = 100# 折扣self.discount = 0.8@propertydef price(self):# 实际价格 = 原价 * 折扣new_price = self.original_price * self.discountreturn new_price@price.setterdef price(self, value):self.original_price = value@price.deleterdef price(self):print('del')del self.original_price# ############### 调用 ###############obj = Goods()obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值obj.price = 123 # 自动执行 @price.setter 修饰的 price 方法,并将 123 赋值给方法的参数del obj.price # 自动执行 @price.deleter 修饰的 price 方法
使用property升级getter和setter方法
class Money(object):def __init__(self):self.__money = 0def getMoney(self):return self.__moneydef setMoney(self, value):if isinstance(value, int):self.__money = valueelse:print("error:不是整型数字")# 定义一个属性,当对这个money设置值时调用setMoney,当获取值时调用getMoneymoney = property(getMoney, setMoney) #这是Python2遗留的方法a = Money()a.money = 100 # 调用setMoney方法print(a.money) # 调用getMoney方法
使用property取代getter和setter方法,可做边界判定
class Money(object):def __init__(self):self.__money = 0# 使用装饰器对money进行装饰,那么会自动添加一个叫money的属性,当调用获取money的值时,调用装饰的方法@propertydef money(self):return self.__money# 使用装饰器对money进行装饰,当对money设置值时,调用装饰的方法@money.setterdef money(self, value):if isinstance(value, int):self.__money = valueelse:print("error:不是整型数字")a = Money()a.money = 100print(a.money)