什么是属性对象?

27

我对Python并不陌生,但这里有一个非常基础的问题。

我正在使用Python进行一些探索,并发现了type属性。

>>> 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个回答

23

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作为装饰器的使用有些掩盖了bar是一个property对象的事实。等价的定义是


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

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

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

property类(以及实例方法、类方法和静态方法)是Python通用描述符协议的特定应用,该协议定义了具有__get____set__和/或__del__方法的类属性的行为。


6
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

你也可以使用以下代码创建一个设置器来设置该值:
  ...
   @item_cost.setter
   def set_item_cost(self,value):
         pass #do something with value
  ...
 MyClass(1,2,3,4).item_cost = "yellow"

总体来说,我认为它们有点像反模式,但有些人喜欢它们。

(顺便提一句,你也可以将其作为一个普通函数使用并将其作为属性进行设置 MyClass.item_cost_prop = property(MyClass.item_cost))


4

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


1
基本上,使用那种符号表示法可以避免装饰器符号的使用。 - Malik Brahimi
7
这并没有解释属性实际上是什么。 - user2357112

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接