Цель этого вопроса - понять, как «встроенные» встроенные функции в python.Как отказаться от метода __setattr__?
Если я переопределяю метод setattr, как я могу его вернуть? Например, у меня есть класс «Работа», как это:
class WorkingSetAttr:
def a(self): return 'a'
def b(self): return 'b'
и класс «нерабочим», как это:
class NonWorkingSetAttr:
def a(self): return 'a'
def b(self): return 'b'
def __setattr__(self,a,b): pass
Теперь я создаю объекты ш и п и выполните следующее:
w = WorkingSetAttr()
setattr(w,'a',w.b)
print "w.a = %s, w.b = %s" % (w.a(), w.b())
n = NonWorkingSetAttr()
setattr(n, 'a', n.b)
print "n.a = %s, n.b = %s" % (n.a(), n.b())
выход:
w.a = b, w.b = b
n.a = a, n.b = b
Обратите внимание, что n.a должен печатать «b», но печатает «a», потому что setattr не изменяет атрибут.
Вопрос: Как я должен изменить объект п так, что он работает как объект ш. Заметьте, что я имею в виду объекты, а не классы.
Это (почти) всегда плохая идея, чтобы изменить _objects_ без изменения их классы , В конце концов, экземпляр предназначен для экземпляра определенного класса! Если вы нарушаете эти отношения, вы получаете «вещи», о которых вы мало что знаете, и которые вы не можете отлаживать. – katrielalex
@KevinDTimm встроенный метод Python 'setattr' устанавливает атрибут, который в свою очередь вызывает' __setattr__' объекта класса. – katrielalex
'__setattr__' вызывается из setattr. Посмотрите, как это работает для случая «w» (вывод изменяется с «a» на «b»). Дело в том, что: как я могу вернуть встроенную функцию, если я просто «сломал» ее. – Juha