如何定义IronPython静态属性?
我之前看到有人讨论在(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)
,就需要一个新的元类。