1、@property 内置装饰器函数,把一个方法调用方式变成属性调用方式。(将一个方法当成一个属性使用)。注意@property装饰器只能在面向对象中使用。
2、访问使用@property装饰器装饰的函数可以直接调用函数名
(会执行一段功能(函数)然后返回值)
3、@property 装饰器只能修饰不带参数的方法。
4、@property装饰器修饰私有方法的getter和setter方法。和控制属性的访问权限-只读。
举例1:使用@property装饰器
from math import pi
class Circle:
def __init__(self, r):
self.r = r
@property
def perimeter(self):
return 2 * pi * self.r
@property
def area(self):
return pi * self.r ** 2
c1 = Circle(5)
print(c1.perimeter)
print(c1.area)
如上代码所示,如果不使用@property的话,那么print(c1.perimeter)就应该是print(c1.perimeter()),area同理。即,周长面积这种参数应该被当作变量来使用,而不是函数。
使用@property装饰器定义getter、setter、deleter 方法
class Person:
def __init__(self, name, age):
self.__name = name
self.__age = age # self.__age就是一个私有属性,对象就不能使用了
@property
def name(self):
return self.__name
@property
def age(self, age):
return self.__age
# @property修饰的方法名称是xx,这里就@xx.setter
# @age.setter是property的副产品
@age.setter
def age(self, age):
if age < 0 and age > 150:
print('不合法啊,superboy')
return
self.__age = age
def __str__(self):
msg = '姓名:{},年龄:{}'.format(self.__name, self.__age)
return msg
per = Person('ZS', 10)
print(per)
per.age = 16
print(per)
print(per.name)
输出为:
姓名:ZS,年龄:10
姓名:ZS,年龄:16
ZS