在写python类的时候,虽然可以通过“实例名.变量名”的方式对实例中的变量进行读取和赋值。但出于规范性等等原因,我们最好还是写getter和setter,不过这样的话在读取变量和赋值时代码就显得有些臃肿,也不那么随心所欲了。那么有没有即保证数据规范性又直接简单访问数据的方式呢?有,使用property() 函数和@property修饰符。
# coding=utf-8
class Foo(object):
def __init__(self,name):
self.__name=name #self.__name自动变形为self._Foo__name私有属性
@property #read定义特性
def name(self):
return self.__name
@name.setter #write 向特性附加setter方法实现写操作
def sname(self,value):
if not(isinstance(value,str)):
raise TypeError("Must be a string!")
self.__name=value
@name.deleter #delete 向特性附加deleter方法实现删除操作
def name(self):
del self.__name
f=Foo("Guido")
n=f.name #调用f.name()-get函数
#m=f.sname(2) ???先调用第一个特性函数,得到str,在进行()TypeError: 'str' object is not callable
f.sname="Monty" #调用setter name(f,"Monty")函数
f._Foo__name=1 #仍可通过变形后的属性名称进行属性访问,并非真正“私有”
print(f.name)
#1
del f.name #调用deleter name(f)函数
print(f.name)
#AttributeError: 'Foo' object has no attribute '_Foo__name'