如何定义IronPython静态属性?

0 投票
1 回答
1503 浏览
提问于 2025-04-16 21:07

我之前看到有人讨论在(Iron)Python中如何定义静态方法,但没有找到关于静态属性的讨论。我想静态属性应该是可以创建的,因为属性其实就是.NET CLR中的方法。下面的代码就是我这么做的。不过,当我调用静态属性 "StaticField" 时,似乎无法直接获取它所关联的静态字段 "__staticField" 的值,而是得到了一个指向属性存储位置的引用?但是如果我使用静态方法 "getStaticField",它作为获取属性的方法,就能正确返回值 "2"。

所以我的问题是:在(Iron)Python中可以定义静态属性吗?我该如何使用它们来获取值,而不是属性方法的引用呢?

谢谢大家!

class Test(object):
    __instanceField = 0
    __staticField = 0    

    # Instance Property (read-only)
    def getInstanceField(self):   
        return self.__instanceField    
    InstanceField = property(getInstanceField, None, None)

    # Static Property (read-only)
    @staticmethod
    def getStaticField():
        return Test.__staticField        
    StaticField = property(getStaticField, None, None)

    # Instance Method
    def instanceMethod(self, n):
        self.__instanceField += 1   
        print 'instanceMethod', n

    # Static Method
    @staticmethod
    def staticMethod(n):
        Test.__staticField += 1  
        print 'staticMethod', n

# Calling Static Methods
Test.staticMethod(5)
Test.staticMethod(10)

# Calling Instance Methods
t = Test()
t.instanceMethod(5)
t.instanceMethod(10)

print 'InstanceProperty', t.InstanceField 
#prints 2
print 'StaticProperty', Test.StaticField 
#prints: <property object at 0x000000000000002B>
print 'StaticPropertyMethod', Test.getStaticField()
#prints 2

1 个回答

1

这个回答是关于Python的一般内容,不特指IronPython。

property 是一个方便的工具,用来创建一个 描述符,这个描述符是一个对象,它提供了 __get__ 方法,另外还可以选择性地提供 __set____del__ 方法。__get__ 方法接受目标实例和相关类的参数,但 __set__ 方法在类中是不会被调用的。如果你只需要获取值的功能,而不需要设置值的功能,那你可以直接实现一个描述符。

class StaticGetter(object):
    def __init__(self, attr):
        self.attr = attr
    def __get__(self, instance, owner):
        # owner is the class, your getter code here
        return getattr(owner, attr)

class Test(object):
    __staticField = 0
    staticField = StaticGetter('_Test__staticField')

如果你需要设置值的功能,你可以提供一个 __set__ 方法,这个方法可以从实例中推断出类,但要让 Test.staticField = newvalue 变成调用 Test.staticField.someSetterMethod(newvalue),就需要一个新的元类。

撰写回答