2014-04-03 97 views
0

給定一個描述符類MyDescriptor用一個額外的方法describe,以及一個使用描述符定義屬性a的類,如何在a上調用方法describe在Python中,如何在描述符上調用實例方法?

class MyClass(object): 
    a = MyDescriptor() 

    def dump(self): 
     print a.describe() 

當我創建MyClass的實例,其屬性設置爲42,然後調用dump(),我得到:

"AttributeError: 'int' object has no attribute 'describe'". 

我想使用的描述符攜帶的一些元數據它的方式方法被調用。我需要找到一種方法來爲該元數據詢問描述符實例。

+1

'self.a.describe()'?請注意,由於您使用的是「類變量」,因此「MyClass」的所有實例都將包含「MyDescriptor」的_same_實例。 –

回答

2

要訪問描述符對象本身,您需要使用類的__dict__屬性調用它。

def dump(self): 
    print type(self).__dict__['a'].describe() 

欲瞭解更多關於描述符的信息,請閱讀Descriptor HowTo Guide

演示:

class MyDescriptor(object): 

    def __get__(self, obj, type=None): 
     return self._val 

    def __set__(self, obj, val): 
     self._val = val 

    def describe(self): 
     return 'inside describe' 

class MyClass(object): 

    a = MyDescriptor() 

    def __init__(self): 
     self.a = 42 

    def dump(self): 
     print 'Inside dump()' 
     print self.a.describe() 

    def dump2(self): 
     print 'Inside dump2()' 
     print type(self).__dict__['a'].describe() 

MyClass().dump2() 
print '-'*20 
MyClass().dump() 

輸出:

Inside dump2() 
inside describe 
-------------------- 
Inside dump() 

Traceback (most recent call last): 
    File "C:\Python27\SO.PY", line 26, in <module> 
    MyClass().dump() 
    File "C:\Python27\SO.PY", line 19, in dump 
    print self.a.describe() 
AttributeError: 'int' object has no attribute 'describe' 
+0

這讓我覺得不必要的複雜。爲什麼要輸入(自己).__ dict__'? 'self.a'直接訪問同一個屬性。 –

+0

@ g.d.d.c'self.a'將調用描述符的'__get__'方法。 –

+0

請注意,如果描述符在調用'__get__'時將'instance'設置爲'None'(表明正在查找類中而不是實例中)時返回自身,則可以避免在類' __dict__',並使用'MyClass.a.describe()'。 – Blckknght

相關問題