没有类的属性方法

11

我有下面的代码

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

2个回答

13

@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

有没有带有classproperty装饰器的pip包? - igor
@igor,我不知道有没有。 你可以简单地复制粘贴它。只有5行。 - shx2

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。

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