Почему дескриптор не получает вызов, если он определяется как атрибут экземпляра?

Когда я делаю переменную «data» переменной класса, работает следующее, но когда я делаю ее объектной переменной, дескриптор не вызывается. Пожалуйста помоги.

class Data(object): products = { 'milk': {'price': 1.50, 'quantity': 10}, 'eggs': {'price': 0.20, 'quantity': 100}, 'cheese': {'price': 2.00, 'quantity': 10} } def __get__(self, obj, klas): print "Here in descriptor" return self.products class BusinessLogic(object): def __init__(self): # When I remove these 2 lines self.data = Data() #data = Data() # and enable this line it does work ! def main(): b = BusinessLogic() b.data if __name__ == '__main__': main() 

One Solution collect form web for “Почему дескриптор не получает вызов, если он определяется как атрибут экземпляра?”

Это потому, что дескрипторы должны быть определены только как атрибуты класса, а не атрибуты экземпляра:

Из документов :

Следующие методы применяются только тогда, когда экземпляр класса, содержащего метод (так называемый класс дескриптора), появляется в классе владельца ( дескриптор должен быть либо в словаре класса владельца, либо в словаре классов для одного из его родителей ).

Чтобы заставить дескриптор работать с атрибутами экземпляра, вам необходимо переопределить метод BusinessLogic __getattribute__ (не проверял это полностью, но отлично __getattribute__ для вашего случая):

 def __getattribute__(self, attr): obj = object.__getattribute__(self, attr) if hasattr(obj, '__get__'): return obj.__get__(self, type(self)) return obj 

Если у вас есть дескриптор данных, вам также нужно обработать часть __setattr__ .

 def __setattr__(self, attr, val): try: obj = object.__getattribute__(self, attr) except AttributeError: # This will be raised if we are setting the attribute for the first time # ie inside `__init__` in your case. object.__setattr__(self, attr, val) else: if hasattr(obj, '__set__'): obj.__set__(self, val) else: object.__setattr__(self, attr, val) 
  • Как создать декоратор для ленивой инициализации свойства
  • Статические и экземплярные методы в Python
  • Понимание дескрипторов __get__ и __set__ и Python
  • Почему свойства должны быть атрибутами класса в Python?
  • Как вызвать методы на объектах дескриптора класса Python?
  • Использование дескрипторов в неашинируемых классах - python
  • Когда и почему я могу назначить экземпляр класса дескриптора атрибуту класса в Python, а не использовать свойство?
  • Почему объявление класса дескриптора в функции __init__ нарушает функциональность дескриптора?
  • Дескрипторы как атрибуты экземпляра в python
  • Определить утечки дескриптора файла в python?
  • Использование экземпляра класса как атрибута класса, дескрипторов и свойств
  • Python - лучший язык программирования в мире.