property: 在新式类中,将类的方法变成属性,方便调用, 1,对他的get方法,添加@property装饰器, 对他的set方法和del方法要是同名函数的,添加@get方法对应的的函数名.setter, 对于python2 的经典类,只有类的get方法有效
class Student(object):
@property
def birth(self):
print("birth的get方法")
return self._birth
@birth.setter
def birth(self, value):
print("birth的setter方法")
self._birth = value
print(self._birth)
@birth.deleter
def birth(self):
print("birth的deleter方法")
s = Student()
s.birth = 23 # 设置
print(s.birth) # 获取
s.birth=22 # 执行装饰器带有settter的方法
del s.birth # # 执行装饰器带有settter的方法
class Foo(object):
def get_bar(self):
print('getter......')
return '老王'
def set_bar(self,value):
print('setter........')
return 'set value'+ value
def del_bar(self):
print('deleter........')
return "删除老王"
BAR = property(get_bar,set_bar,del_bar,"description......") #用help(property) 可查看property的各种参数方法
obj = Foo()
print(obj.BAR)
obj.BAR = "alex" # 自动调用第二个参数中定义的方法,set_bar方法,并将"alex'当做参数传入
desc = Foo.BAR.__doc__ # 自动获取第四个参数中设置的值, description..
del obj.BAR # 自动调用del_bar 方法
输出:
birth的setter方法
23
birth的get方法
23
birth的setter方法
22
birth的deleter方法
getter......
老王
setter........
deleter........
property应用
初始:
class Student(object):
def get_score(self):
print('你个网吧打啊')
return self._score
def set_score(self, value):
print('吃啥啊',value)
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
s = Student()
s.set_score(60) # ok!
print(s.get_score())
s.set_score(90)
print(s.get_score())
输出:
吃啥啊 60
你个网吧打啊
60
吃啥啊 90
你个网吧打啊
90
优化:
class Student(object):
@property
def score(self):
return self._score
@score.setter
def score(self,value):
if not isinstance(value, int):
raise ValueError('分数必须是整数才行呐')
if value < 0 or value > 100:
raise ValueError('分数必须0-100之间')
self._score = value
s = Student()
s.score = 60 # OK,实际转化为s.set_score(60)
print(s.score )# OK,实际转化为s.get_score()
s.score = 98
print(s.score )
输出:
60
98