Форум сайта python.su
0
Добрый день.
Почему следующий код:
class Person: def __init__(self, name): # Вызывается при обращении Person() self._name = name # Вызовет __setattr__! def __getattr__(self, attr): # Вызывается операцией obj.undefined if attr == 'name': # Для отсутствующего атрибута с именем name print('fetch...') return self._name # Не вызывает зацикливание: # существующий атрибут else: # Обращение к другим несуществующим raise AttributeError(attr) # атрибутам вызывает ошибку def __setattr__(self, attr, value): # Вызывается операцией obj.any = value if attr == 'name': print('change...') attr = '_name' # Внутреннее имя атрибута self.__dict__[attr] = value # Предотвратить зацикливание def __delattr__(self, attr): # Вызывается операцией del obj.any if attr == 'name': print('remove...') attr = '_name' # Предотвратить зацикливание, del self.__dict__[attr] # но менее обычным способом if __name__ == '__main__': bob = Person('Bob Smith') # Объект bob обладает управляемым атрибутом print(bob.name) # Вызовет __getattr__ bob.name = 'Robert Smith' # Вызовет __setattr__ print(bob.name) del bob.name # Вызовет __delattr__ print('-'*20) sue = Person('Sue Jones') # Объект sue также наследует свойство print(sue.name)
return self._name # Не вызывает зацикливание:
Прикреплённый файлы:
logo small.png (23,7 KБ)
Офлайн
0
И почему в похоже коде с заменой __getattr__ на __getattribute__:
class Person: def __init__(self, name): # Вызывается при обращении Person() self._name = name # Вызовет __setattr__! def __getattribute__(self, attr): # Вызывается операцией [obj.any] if attr == 'name': # Перехватывает обращения к любым именам print('fetch...') attr = '_name' # Отображает на внутреннее имя return object.__getattribute__(self, attr) # Предотвратить зацикливание def __setattr__(self, attr, value): # Вызывается операцией obj.any = value if attr == 'name': print('change...') attr = '_name' # Внутреннее имя атрибута self.__dict__[attr] = value # Предотвратить зацикливание def __delattr__(self, attr): # Вызывается операцией del obj.any if attr == 'name': print('remove...') attr = '_name' # Предотвратить зацикливание, del self.__dict__[attr] # но менее обычным способом if __name__ == '__main__': bob = Person('Bob Smith') # Объект bob обладает управляемым атрибутом print(bob.name) # Вызовет __getattr__ bob.name = 'Robert Smith' # Вызовет __setattr__ print(bob.name) del bob.name # Вызовет __delattr__ print('-'*20) sue = Person('Sue Jones') # Объект sue также наследует свойство print(sue.name)
Прикреплённый файлы:
logo small.png (25,8 KБ)
Офлайн
103
# . . . def __init__(self, name): # Вызывается при обращении Person() self.__dict__['_name'] = name self._name = name # Вызовет __setattr__! # . . .
Офлайн