2012-09-29 2 views
1

Я пытаюсь получить свойство, чтобы напечатать имя, которому он назначен в классе владельца в python, и я разработал метод, который, кажется, работает тогда и только тогда, когда свойство напрямую назначено. Это не работает, если свойство наследуется, как показано ниже. Что хорошего, так что при вызове Handler.CLIENT_ID или SubHandler.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 

„МРО“ означает порядка разрешения методов, и является список базовых классов в том порядке, в котором python будет искать методы и другие атрибуты, определенные классом. Сканирование этого списка означает, что вы будете искать свойство по базовым классам в том же порядке, который использовал бы Python.

Ваш пример кода корректно работает с указанным кодом:

>>> h = Handler() 
>>> print h.CLIENT_ID 
CLIENT_ID 
>>> s = SubHandler() 
>>> print s.CLIENT_ID 
CLIENT_ID 
Смежные вопросы