什么是属性对象?

时间:2015-05-04 18:48:29

标签: python python-2.7 properties

我不是python的新手,但我在这里有一个非常基本的问题。

我正在玩python并发现有类型属性

>>> property
<type 'property'>

但我只听说过函数上下文中的属性。

>>> a = property()
<property object at 0x0246C090>

但是属性对象怎么样?它们有什么用?属性方法不是非常直观或暗示

>>> dir(a)
['__class__', '__delattr__', '__delete__', '__doc__', '__format__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__set__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'deleter', 'fdel', 'fget', 'fset', 'getter', 'setter']

感谢您的关注!

3 个答案:

答案 0 :(得分:8)

property对象就是您实际想到的属性。考虑这个例子:

class Foo(object):
    def __init__(self):
        self._bar = 0

    @property
    def bar(self):
        return self._bar + 5

Foo.bar是一个具有__get__方法的属性对象。当你写像

这样的东西
x = Foo()
print(x.bar)

x.bar的查找发现type(x).bar__get__方法,因此属性查找等同于

type(x).bar.__get__(x, type(x))

产生值x._bar + 5

使用property作为装饰器有点模糊了barproperty对象的事实。等同的定义是

class Foo(object):
     def __init__(self):
         self._bar = 0

     bar = property(lambda self: self._bar + 5)

更明确地显示您正在使用给定的property表达式创建lambda对象作为该属性的getter,并将该对象绑定到类属性bar

property类(以及实例方法,类方法和静态方法)是Python的通用描述符协议的特定应用程序,它使用__get__定义类属性的行为,{{1 }和/或__set__方法。

答案 1 :(得分:4)

class MyClass:
    def __init__(self,*costs):
        self.costs = costs
    def item_cost(self):
        return sum(self.costs)

现在你可以做到

MyClass(1,2,3,4).item_cost() #prints 10

但我们可以把它变成一个属性

class MyClass:
    def __init__(self,*costs):
        self.costs = costs
    @property
    def item_cost(self):
        return sum(self.costs)

现在我们可以将其作为简单变量

访问
MyClass(1,2,3,4).item_cost

您还可以使用

为该值创建一个setter
  ...
   @item_cost.setter
   def set_item_cost(self,value):
         pass #do something with value
  ...
 MyClass(1,2,3,4).item_cost = "yellow"

一般来说,我觉得它们有点像反模式......但有些人喜欢em

(旁注,你也可以把它作为常规函数而不是装饰器MyClass.item_cost_prop = property(MyClass.item_cost)使其成为属性)

答案 2 :(得分:2)

属性是包含getter和setter方法的属性对象。