Python内置函数进阶之“属性(property())”详解

来源:互联网 发布:淘宝双11 销售额 编辑:程序博客网 时间:2024/05/18 09:22

属性函数(property)有以下作用:
- 将类方法转换为只读属性
- 重新实现一个属性的setter和getter方法

将类方法转换为只读属性

class Person(object):    """"""    #----------------------------------------------------------------------    def __init__(self, first_name, last_name):        """Constructor"""        self.first_name = first_name        self.last_name = last_name    #----------------------------------------------------------------------    @property    def full_name(self):        """        Return the full name        """        return "%s %s" % (self.first_name, self.last_name)

以上创建了
两个类属性:self.first_name和self.last_name
一个full_name方法
调用full_name方法为person.full_name(),用@property变为person.full_name

>>> person = Person("Mike", "Driscoll")>>> person.full_name'Mike Driscoll'>>> person.first_name'Mike'>>> person.full_name = "Jackalope"Traceback (most recent call last):  File "<string>", line 1, in <fragment>AttributeError: can't set attribute

但他只具有只读属性,不能更改
Python进阶之“属性(property)”详解
Python 中的 property 属性

两个等同的代码:

class Foo:    def __init__(self,val):        self.__NAME=val #将所有的数据属性都隐藏起来    @property #get    def name(self):        return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)    @name.setter #set    def name(self,value):        if not isinstance(value,str):  #在设定值之前进行类型检查            raise TypeError('%s must be str' %value)        self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME    @name.deleter #delete    def name(self):        raise TypeError('Can not delete')f=Foo('egon')print(f.name)# f.name=10 #抛出异常'TypeError: 10 must be str'del f.name #抛出异常'TypeError: Can not delete'
class Foo:    def __init__(self,val):        self.__NAME=val #将所有的数据属性都隐藏起来    def getname(self): #get        return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)    def setname(self,value): #set        if not isinstance(value,str):  #在设定值之前进行类型检查            raise TypeError('%s must be str' %value)        self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME    def delname(self): #delete        raise TypeError('Can not delete')    name=property(getname,setname,delname) #最后把方法变成属性#一种property的古老用法
阅读全文
0 0
原创粉丝点击