Python3_CookBook_之创建可管理的属性

##创建可以管理的属性###
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)

 

 

 

posted @ 2018-10-26 09:37  凤舞琦天  阅读(88)  评论(0)    收藏  举报
https://files.cnblogs.com/files/liuguoqi/weinxin.bmp