##创建可以管理的属性###
class Person :
def __init__(self,first_name) :
self.first_name = first_name
#Getter function
@property
def first_name(self) :
return self._first_name
#setter function
@first_name.setter
def first_name(self,value) :
if not isinstance(value,str) :
raise TypeError('Expected a string')#raise Exception('Expected a string')
self._first_name = value
#deleter function(optional)
@first_name.deleter
def first_name(self) :
raise AttributeError("Can't delete attribute")
a = Person('Guido')
a.first_name = 'OK'
del a.first_name
#如果我们实现了一个property时,底层数据(如有的话)仍然需要保存到某个地方
#因此在get和set方法中,可以看到我们直接是对_first_name进行操作的,这就是数据实际保存的地方
#为什么在__init__()方法中设定的是self.first_name而不是self._first_name?
#在这个例子中property的全部意义就是我们在设置属性可以执行类型的检查,因此你很有可能你想让这种类型的检查在初始化的时候也可以运行
#因此,在__init__()中设置self.first_name,实际上会调用setter方法(因此检查会跳过self.first_name而去访问self._first_name)
##在这个例子中property的全部意义就是我们在设置属性可以执行类型的检查,因此你很有可能你想让这种类型的检查在初始化的时候也可以运行
#因此,在__init__()中设置self.first_name,实际上会调用setter方法(因此检查会跳过self.first_name而去访问self._first_name)
##对于已存在的get和set方法,同样也可以将它们定义为property
class Person:
def __init__(self,first_name):
self.set_first_name(first_name)
#Getter function
def get_first_name(self) :
return self._first_name
#setter function
def set_first_name(self,value) :
if not isinstance(value,str) :
raise TypeError('Expected a string')#raise Exception('Expected a string')
self._first_name = value
#deleter function(optional)
def del_first_name(self) :
raise AttributeError("Can't delete attribute")
b = Person("tt")
name = property(get_first_name,set_first_name,del_first_name)