不带类的属性方法[重复]


问题内容

这个问题已经在这里有了答案

模块可以具有与对象相同的属性吗? (6个答案)

7年前关闭。

我有下一个代码

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中是否可以在类外使用属性装饰器?


问题答案:

@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