LINUX.ORG.RU

Декорирование метаклассов. Пример в книге не работает

 ,


0

1
class Metaclass(type):
    def __new__(meta, clsname, supers, attrdict):
        print('In M.__new__:')
        print([clsname, supers, list(attrdict.keys())])

def decorator(cls):
    return Metaclass(
        cls.__name__,
        cls.__bases__,
        dict(cls.__dict__),
    )

class A:
    x = 1

@decorator
class B(A):
    y = 2
    
    def m(self):
        return self.x + self.y


B.x, B.y

i = B()
i.x, i.y, i.m()

По книге должно быть:

B.x, B.y
(1, 2)

i = B()
i.x, i.y, i.m()
(1, 2, 3)

по факту:

./test.py
In M.__new__:
['B', (<class '__main__.A'>,), ['__module__', 'y', 'm', '__doc__']]
Traceback (most recent call last):
  File "/home/user/code/./test.py", line 360, in <module>
    B.x, B.y
AttributeError: 'NoneType' object has no attribute 'x'

Если я делаю

print(B)
out: None

т.е не «отдекорировался» класс

★★★

Последнее исправление: serg002 (всего исправлений: 2)

Декорирование сработало. Ведь

In M.__new__:
['B', (<class '__main__.A'>,), ['__module__', 'y', 'm', '__doc__']]

вывелось.

Но __new__ должен вернуть объект. У тебя не возвращает. Добавь

return super().__new__(meta)
monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)