关于在类中使用@property网上教程都介绍了许多,我从另一个方向解释一下在类中使用@property。
下面是一个例子,创建一个Person类,在age方法的定义前加上@property,在name方法的定义前没有加上@property:
class Person(object):
def __init__(self, age = 1, name = 'yy'):
self._age = age
self._name = name
@property
def age(self):
return self._age
@age.setter
def age(self,age):
if isinstance(age, int):
self._age = age
else:
raise ValueError('age must be integer!')
# @property
def name(self):
return self._name
if __name__ == '__main__':
person = Person()
person.age = 10
print(person.age)
print("type of age:{}".format(type(person.age)))
print("type of name:{}".format(type(person.name)))
此时,返回的结果为
1
10
type of age:<class 'int'>
type of name:<class 'method'>
分析结果:
- age默认值是1,实例化Person类的时候更改age的值,返回默认值1。第一行结果符合预期。但是需要注意的是,大家是否对print(person.age)这一行有些疑问,age后面为什么没有括号,即print(person.age())?如果这样来写,会报错:TypeError: 'int' object is not callable。age现在是int类型,而不是method类型,所以不可以被调用。这个疑问会再进一步进行分析
- 调用person.age=10后,将age的值改为10,返回10。第二行结果符合预期
- 三四行的结果显示,age是int类型,name是method类型
如果此时将name前的@property加上,即
class Person(object):
[省略...]
@property
def name(self):
return self._name
返回的结果是:
1
10
type of age:<class 'int'>
type of name:<class 'str'>
可以看到,一旦在method前面加上@property后,会将method类型更改成return结果的类型:
- 对于age来说,由于_age是int类型,所以age从method类型变成了int类型
- 对于name来说,由于_name是str类型,所以name从method类型变成了str类型
总结
类中的方法前加上@property后,会将该方法从方法类型改为return结果的类型。