我之前已经讨论过如何在(Iron)Python中定义静态方法,但是,我没有找到任何关于静态属性的内容。我假设您可以明确地创建静态属性,因为属性只是.NET CLR的方法,这就是我在下面的代码中所做的,但是,它看起来像通过调用静态属性“StaticField”我不能访问它链接到的静态字段“__staticField”的值,而不是我得到一个存储属性的引用? ,但如果我使用静态方法“getStaticField”用作Get属性,它会正确地给我值“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
答案 0 :(得分:1)
这个答案一般用于python,而不是特定于IronPython。
property
可以方便地创建描述符,这是一个提供__get__
和可选的__set__
和__del__
方法的对象。 __get__
方法接受目标实例以及关联类的参数,但永远不会为类调用__set__
。如果你需要的只是没有setter行为的getter行为,那就直接实现一个描述符
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')
对于setter,您可以提供__set__
方法,该方法可以从实例中推断出类,但是安排Test.staticField = newvalue
代替调用Test.staticField.someSetterMethod(newvalue)
将需要新的元类