9

我有下一个代码

global_variable = 1

@property
def method():
    # Some magic, for example 
    # incrementing global variable
    global global_variable
    global_variable += 1
    return global_variable

print method

此代码返回

<property object at 0x28dedb8>

但我希望 2. 在 python 中可以在类之外使用属性装饰器吗?

4

2 回答 2

11

@properties是在类中定义的实例属性。例如:

class A(object):
   @property
   def a(self):
      return 2

b = A()
b.a
=> 2

如果我理解,您正在尝试定义模块属性(或“全局”属性)。没有简单/干净的方法可以做到这一点。请参阅此相关问题

编辑:您还可以定义classproperty, 以使您的属性更像全局(不需要实例)。classproperty不是内置的,但很容易定义。这是定义它的一种方法:

class classproperty(object):
    def __init__(self, f):
        self.f = classmethod(f)
    def __get__(self, *a):
        return self.f.__get__(*a)()

现在你可以这样做:

class A(object):
   @classproperty
   def a(self):
      return 2

A.a
=> 2
于 2013-06-09T08:43:14.673 回答
2

观察以下代码:

@property
def f():
    return 1

print f

class a(object):
    @property
    def f(self):
        return 2

print a.f
b = a()
print b.f

输出:

<property object at 0x7f892bfb11b0>
<property object at 0x7f892bfb1208>
2

@property 仅适用于已实例化的类对象。

于 2013-06-09T08:47:39.797 回答