Я пытаюсь украсить реальный класс, используя этот код:
def my_decorator(cls):
def wrap(*args, **kw):
return object.__new__(cls)
return wrap
@my_decorator
class TestClass(object):
def __init__(self):
print "__init__ should run if object.__new__ correctly returns an instance of cls"
test = TestClass() # shouldn't TestClass.__init__() be run here?
Я не получаю ошибок, но также не вижу сообщения от TestClass.__init__()
.
Согласно документам для классов нового стиля :
Типичные реализации создают новый экземпляр класса, вызывая метод __new__()
суперкласса, используя super(currentclass, cls).__new__(cls[, ...])
с соответствующими аргументами, и затем изменяя вновь созданный экземпляр по мере необходимости перед его возвратом.
Если __new__()
возвращает экземпляр cls, то будет вызываться метод __init__()
нового экземпляра, например __init__(self[, ...])
, где self - это новый экземпляр, а остальные аргументы такие же, как были переданы в __new__()
.
Есть идеи, почему __init__
не работает?
Также я попытался позвонить __new__
так:
return super(cls.__bases__[0], cls).__new__(cls)
но он вернет TypeError
:
TypeError: super.__new__(TestClass): TestClass is not a subtype of super