Я новичок в метапрограммировании на Python и пытаюсь создать классы, используя Mixin
, который использует attr
. Я написал код ниже. Мои объекты инициализируются правильно, но __init__ не вызывается. Также в MRO объекта есть 4 записи вместо 2.
Может ли кто-нибудь помочь мне выяснить, какова возможная причина этого?
import attr
class Meta(type):
"""
This gives us powerful flexibility to define C{attrs} instances with
default values for attributes, and converter/validator methods.
"""
def __new__(mcs, name, bases, namespace):
if 'PROPS' not in namespace:
namespace['PROPS'] = []
new_cls = attr.make_class(name,
{property_name: for property_name in
namespace['PROPS']})
# Merge the attr class to present class.
return super(Meta, mcs).__new__(mcs, name, (new_cls,) + bases, namespace)
@six.add_metaclass(Meta)
class Mixin(object):
"""
When sub-classed, this class provides behavior similar to C{attr.attrs} decorator.
"""
def __init__(self, *args, **kwargs):
print("Initialized")
class Test(Mixin):
PROPS = ['test']
t = Test('test'=1) // Doesn't prints Initialized
Test.__mro__
(__main__.Test,
__main__.Test,
__main__.Mixin,
__main__.Mixin,
object)
Подведем два итога:
Почему 4 записи в __mro __?
Почему __init__ не вызывается?