对比:
一、常规方法(对方法age)
class Person(object):
def __init__(self):
self._age = None
def age(self, n):
if 0<=n<=100:
self._age = n
else:
print("age_error")
person1 = Person()
person1.age(1000)
print(person1._age)
#代码执行结果:
age_error
Traceback (most recent call last):
File "E:/python谭子琨/tzk708_oop/1.属性包装.py", line 19, in <module>
print(person1._age)
AttributeError: 'Person' object has no attribute '_age'
二、属性包装方法(对方法age)
class Person(object):
def __init__(self):
self._age = None
@property
def age(self):#访问会执行
return self._age
@age.setter
def age(self, n):#设置会执行
if 0<=n<=100:
self._age = n
else:
raise ValueError("age_error")
@age.deleter
def age(self):
print("删除,会执行这里")
p1 = Person()
#把一个方法属性包装之后就不需要用p1.age()
# 这个方法就像一个属性了
print(p1.age)#访问
p1.age = 100#设置
print(p1.age)
del p1.age#删除
#代码执行结果:
None
100
删除,会执行这里#但是没有真正删除,只是条用了@age.deleter但是里面没有写del self._age