@SuHongjun
2020-06-01T16:26:11.000000Z
字数 1871
阅读 145
Python
2020春季学期
#只读属性
class Person(object):
def __init__(self,name,birth,gender='unknown'):
self.name = name
self._birth = birth
self.gender = gender
@property #定义了一个只读属性 age
def age(self): #只能有一个self参数
return 2020 - self._birth
Jack = Person('Jack',1995)
print(Jack.age)
#输出25
property属性的定义和调用要注意一下几点:
1. 定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数
2. 调用时,无需括号
class Person(object):
@property
def birth(self): #可读写属性
return self._birth
@birth.setter #可写属性, @property创建出来的装饰器
def birth(self, value):
self._birth = value
@property
def age(self): #只读属性
return 2015 - self._birth
>>> Jack = Person()
>>> Jack.birth = 1998
>>> Jack.age
17
#新式类中的property有三种访问方式,并分别对应了三个被 @property、@方法名.setter、@方法名.deleter 修饰的方法
class Goods(object):
def __init__(self):
# 原价
self.original_price = 100
# 折扣
self.discount = 0.8
@property
def price(self):
# 实际价格 = 原价 * 折扣
new_price = self.original_price * self.discount
return new_price
@price.setter
def price(self, value):
self.original_price = value
@price.deleter
def 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 = 0
def getMoney(self):
return self.__money
def setMoney(self, value):
if isinstance(value, int):
self.__money = value
else:
print("error:不是整型数字")
# 定义一个属性,当对这个money设置值时调用setMoney,当获取值时调用getMoney
money = 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的值时,调用装饰的方法
@property
def money(self):
return self.__money
# 使用装饰器对money进行装饰,当对money设置值时,调用装饰的方法
@money.setter
def money(self, value):
if isinstance(value, int):
self.__money = value
else:
print("error:不是整型数字")
a = Money()
a.money = 100
print(a.money)