我不是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']
感谢您的关注!
答案 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
作为装饰器有点模糊了bar
是property
对象的事实。等同的定义是
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方法的属性对象。