Python之“属性property

Python中有一个被称为属性函数(property)的小概念,它可以做一些有用的事情,比如:

  • 将类方法转换为只读属性
  • 重新实现一个属性的setter和getter方法

将类方法转换为只读属性:

class A:
    @property
    def x(self):
        return 'abc'
a = A()
a.x
# Out[11]: 'abc'
# 对属性函数赋值,将抛出异常
a.x = '123'       # 被property装饰的方法,作为属性函数,不可赋值,只可读-----即,只读属性

 

重新实现一个属性的setter和getter方法

假设有一些遗留代码,它们是由一些对Python理解得不够好的人写的。

要使用这个类,我们必须要使用定义的getter和setter方法​​:

如果你像我一样,你之前已经看到过这类的代码:

class Fees:
    def __init__(self):
        self.__fee = 0
    def get_fee(self):
        return self.__fee
    def set_fee(self, value):
        self.__fee = value
f = Fees()
f.set_fee(123)
f.get_fee()
# out: 123

 

如果你想添加可以使用正常点符号访问的属性,而不破坏所有依赖于这段代码的应用程序,你可以通过添加一个属性函数非常简单地改变它:

class Fees:
    def __init__(self):
        self.__fee = 0
    def get_fee(self):
        return self.__fee
    def set_fee(self, value):
        self.__fee = value
    fee = property(fget=get_fee, fset=set_fee)
f = Fees()

 

f.set_fee(123)
f.get_fee()
# out: 123

f.fee
# out: 123
f.fee = 100
f.fee
# out: 100

正如你所看到的,当我们以这种方式使用属性函数时,它允许fee属性设置并获取值本身而不破坏原有代码。

 

使用property装饰器、xxx.setter装饰器,重新设计上面的类:

class Fees:
    def __init__(self):
        self.__fee = 0
    @property
    def fee(self):
        return self.__fee
    @fee.setter
    def fee(self, value):
        self.__fee = value
f = Fees()
f.fee = 100
f.fee
# Out[21]: 100

 

posted on 2019-02-23 13:33  myworldworld  阅读(126)  评论(0)    收藏  举报

导航