2011-07-08 74 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