@property作用
功能1:将方法变为属性(实际上是利用方法将属性变为私有属性)
class Person(object):
def __init__(self,name,age=18):
self.name=name
self.__age=18 #私有属性前面加上双下划线
@property
def age(self):
return self.__age
person=Person('wby')
print(person.name)
print(person.age)
person.age=19 #直接设置age属性,会报错
#Error:AttributeError: can't set attribute
功能2:提供私有属性外部修改方法
class Person(object):
def __init__(self,name,ag):
self.name=name,
self.__age=18
@property
def age(self):
return self.__age
@age.setter #属性.setter可以在外部设置属性值
def age(self,age):
if age<18:
print('年龄不能小于18')
return
self.__age=age
return self.__age
person=Person('wby',18)
print(person.name)
print(person.age)
print('----------------')
person.age=19
print(person.age)
print('----------------')
person.age=17
print(person.age)
property函数
x=property(getattr,setattr,delattr,doc)
Python中访问对象的属性可以这么做:实例名.变量名。但是有些人却不同意这种访问方法,他们觉得这样做破坏了封装的原则,对象的状态对于外部应该是隐藏的。因此,Python中更推荐使用私有特性,通过在名字前面加上双下划线,然后getter,setter方法访问这些特性。
然而,将“实例名.变量名”的方式改为使用getter、setter方法将使代码变得更加复杂臃肿。如果有一种方法能够使简单的访问特性又能保持代码的规范性就好了。property正是解决这一问题的方案。
class A:
def __init__(self,size=10):
print('init')
self._size=size
def getattr(self):
print('getattr')
return self._size
def setattr(self,value):
print('setattr')
self._size=value
def delsize(self):
print('delsize')
del self._size
x = property(getattr,setattr,delsize)
y = 1
a=A()
print('----------')
print(a.x)
print('----------')
print(a.y)
print('----------')
print(A.x)
print('----------')
print(A.y)
print('----------')
a.x=12
print(a.x)
init
----------
getattr
10
----------
1
----------
<property object at 0x000001E4CA4237C0>
----------
1
----------
setattr
getattr
12