Кто-нибудь может помочь мне решить эту проблему с бриллиантами в Python? - PullRequest
0 голосов
/ 12 апреля 2020

У меня проблема, и я не могу найти решение, или, может быть, я не могу понять решения, которые я нашел.

Я думаю, что это называется проблемой Diamond, в основном в моем коде я иметь и класс A наследуется B и C, а затем у меня D наследуется от B и C.

У меня нет проблем с методами класса, это выдает ошибку, когда инициализация.

Я упростил здесь мой исходный код, чтобы вы могли понять, что я делаю.

class RigInfo(object):

    def __init__(self, debug):
        self.debug = debug
        assert isinstance(self.debug, int), '"debug" is an int'


class RigObject(RigInfo):

    def __init__(self,
                 side,
                 debug):
        super(RigObject, self).__init__(debug=debug)

        self.side = side

        assert isinstance(self.side, str), '"side" is a string'
        assert self.side in ['L', 'R', 'C', '_'], '"side" not recognized'


class XaroControl(RigObject):
    def __init__(self,
                 side,
                 debug,
                 control_name,
                 expose_rotate_order=True,
                 rotate_order=0,
                 offsets_list=None,
                 extra_controls_list=None,
                 extra_controls_shape_list=None,
                 size=1.0,
                 color=None,
                 shape_type='circle',
                 with_gimbal=False,
                 gimbal_size=0.9,
                 gimbal_color='white',
                 gimbal_shape_type='circle',
                 gimbal_auto_config=True,
                 lock_attrs=None,
                 unlock_scale=False,
                 match_transforms=None,
                 match_translate=None,
                 match_rotate=None,
                 parent=None
                 ):
        super(XaroControl, self).__init__(side=side, debug=debug)

        lock_attrs = lock_attrs or list()
        self.locked_attrs = lock_attrs + ['s', 'v'] if not unlock_scale else lock_attrs + ['v']

        # input data no visible
        self._expose_rotate_order = expose_rotate_order
        self._rotate_order = rotate_order
        self._offsets_list = offsets_list
        self._extra_controls_list = extra_controls_list
        self._extra_controls_shape_list = extra_controls_shape_list
        self._size = size
        self._shape_type = shape_type
        self._with_gimbal = with_gimbal
        self._gimbal_size = gimbal_size
        self._gimbal_shape_type = gimbal_shape_type
        self._gimbal_auto_config = gimbal_auto_config
        self._match_transforms = match_transforms
        self._match_translate = match_translate
        self._match_rotate = match_rotate
        self._parent = parent
        self.control_name = control_name
        self.gimbal_color = gimbal_color


class RigModule(RigObject):
    def __init__(self,
                 side,
                 debug,
                 module_name,
                 char_name=None,
                 module_type='body_module',
                 geo_group=None,
                 render_geo_group=None,
                 animation_geo_group=None,
                 low_res_geo_group=None,
                 proxy_geo_group=None,
                 body_module_global_space=True,
                 face_module_global_space=False,
                 mirror=False):
        side = 'C' if char_name and not module_name and not side else side
        side = 'C' if not char_name and not module_name and not side else side

        super(RigModule, self).__init__(debug=debug, side=side)

        self.__module_type = module_type
        self.__body_module_global_space = body_module_global_space
        self.__face_module_global_space = face_module_global_space

        self._mirror = mirror
        # input data
        self.char_name = char_name
        self.geo_group = geo_group
        self.render_geo_group = render_geo_group
        self.animation_geo_grp = animation_geo_group
        self.proxy_geo_grp = proxy_geo_group
        self.low_res_geo_grp = low_res_geo_group
        self.module_name = module_name


class CardinalControlMapper(RigModule, XaroControl):

    def __init__(self,
                 side,
                 debug,
                 control_name,
                 size=0.1,
                 color=None,
                 shape_type='square',
                 match_transforms=None,
                 match_translate=None,
                 match_rotate=None,
                 parent=None
                 ):
        RigModule.__init__(self, side=side, debug=debug, module_name=control_name)
        XaroControl.__init__(self,
                             side=side,
                             debug=debug,
                             control_name=control_name,
                             expose_rotate_order=False,
                             rotate_order=0,
                             offsets_list=None,
                             extra_controls_list=None,
                             extra_controls_shape_list=None,
                             size=size,
                             color=color,
                             shape_type=shape_type,
                             lock_attrs=['r', 'tz'],
                             unlock_scale=False,
                             match_transforms=match_transforms,
                             match_translate=match_translate,
                             match_rotate=match_rotate,
                             parent=parent)


CardinalControlMapper(side='L',
                      debug=True,
                      control_name='test',
                      size=0.1,
                      color=None,
                      shape_type='square',
                      match_transforms=None,
                      match_translate=None,
                      match_rotate=None,
                      parent=None)

Выполнение этого кода дает мне эту ошибку:

Traceback (most recent call last):
  File "C:/Users/roure/.PyCharmCE2018.3/config/scratches/scratch.py", line 150, in <module>
    parent=None)
  File "C:/Users/roure/.PyCharmCE2018.3/config/scratches/scratch.py", line 120, in __init__
    RigModule.__init__(self, side=side, debug=debug, module_name=control_name)
  File "C:/Users/roure/.PyCharmCE2018.3/config/scratches/scratch.py", line 89, in __init__
    super(RigModule, self).__init__(debug=debug, side=side)
TypeError: __init__() takes at least 4 arguments (3 given)

Я мог бы просто разбить этот алмаз или просто наследовать от одного из этих классов, но если бы это было возможно, я бы предпочел не делать этого.

Огромное спасибо !!!

1 Ответ

0 голосов
/ 12 апреля 2020

Ладно, так ... Я не знаю причину, почему сейчас, но теперь это работает, я просто изменил синтаксис, я больше не использую "super", и это выглядит нормально.

Раньше:

super(XaroControl, self).__init__(debug=debug, side=side)

Сейчас:

RigObject.__init__(self, side=side, debug=debug)

Я сделал это изменение во всех классах, наследуемых от "RigObject".

Для меня это выглядит так ошибка метода "super ()" в python 2.x, но, возможно, кто-то может дать мне лучшее объяснение.

...