Как вызвать init класса mixin? - PullRequest
0 голосов
/ 24 июня 2019

Я новичок в метапрограммировании на 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)

Подведем два итога:

  1. Почему 4 записи в __mro __?

  2. Почему __init__ не вызывается?

...