2012-09-29 39 views
1

我想獲得一個屬性來打印它在python中的所有者類中分配的名稱,並且我已經制定了一種似乎可行的方法當且僅當該財產是直接分配的。如果該屬性是繼承的,則不起作用,如下所示。什麼是一種好方法,當您撥打Handler.CLIENT_IDSubHandler.CLIENT_ID時,變量名稱CLIENT_ID始終打印?如何從Python類中找到一個屬性的名稱

class Auto(object): 
    def __get__(self, instance, owner): 
     attr_name = (k for (k, v) in owner.__dict__.iteritems() if v == self).next() 
     return attr_name 

class Handler(object): 
    name = 'account' 

    CLIENT_ID = Auto() 

class SubHandler(Handler): 
    pass 

h = Handler() 
print h.CLIENT_ID 
# prints CLIENT_ID 
s = SubHandler() 
print s.CLIENT_ID 
# Traceback (most recent call last): 
# attr_name = (k for (k, v) in owner.__dict__.iteritems() if v == self).next() 
# StopIteration 

回答

2

你可以使用類的__mro__屬性,尋找每個類__dict__財產遍歷基類:

class Auto(object): 
    def __get__(self, instance, owner): 
     attr_name = (k 
      for klass in owner.__mro__ 
      for (k, v) in klass.__dict__.iteritems() 
      if v == self).next() 
     return attr_name 

‘MRO’代表法解析順序,並且是一個基類的列表按python查找方法和其他類定義屬性的順序排列。掃描該列表意味着您將以Python將使用的相同順序在基類中查找屬性。

你的示例代碼工作正常與上面的代碼:

>>> h = Handler() 
>>> print h.CLIENT_ID 
CLIENT_ID 
>>> s = SubHandler() 
>>> print s.CLIENT_ID 
CLIENT_ID 
相關問題