2011-07-08 73 views
0

我发现前面讨论过在(Iron)Python中定义静态方法,但是,我没有找到关于静态属性的任何信息。我认为你可以明确地创建静态属性,因为属性只是.NET CLR的方法,这就是我在下面的代码中所做的,但是,它看起来像通过调用静态属性“StaticField”我无法访问静态字段“__staticField”它被链接到,而我得到一个引用的属性存储? ,但如果使用用作Get属性的静态方法“getStaticField”,它会正确地给我值“2”。如何定义IronPython的静态属性?

所以问题是:你能在(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

我想我发现了什么问题“可以”... 问题似乎是,StaticProperty = property(getStaticField,none,none)将获取Getter参数作为实例方法,这就是为什么当我打电话时它后来它给我属性对象在0x0000 ... 事情是,它不允许我分配一个获取作为静态: StaticField =属性(Test.getStaticField,无,无) 错误:全局测试未定义。 –

回答

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)将需要一个新的元类。

+0

感谢您的评论TokenMacGuy,getattr函数(或__getattribute __())的有趣用法,但我不想定义一个单独的类只是为了处理静态属性,如果我可以使用getStaticField()方法执行相同的操作。这里真正的问题是,如果我可以将静态属性定义为(铁)python中的语法内置支持。 –

+0

你可以在元类中提供你自己的'__getattribute__'方法来做到这一点,但是这个解决方案会更加灵活。 – SingleNegationElimination