Мое множественное наследство-фу не сильно. Я пытаюсь создать суперкласс, у которого __init__
принимает необязательный именованный параметр и подклассы его, которые также наследуются от встроенных типов. К сожалению, у меня появляются, не имеют ни малейшего представления о том, как сделать эту работу:Добавление необязательных параметров в конструкторы многопоследовательных подклассов встроенных типов?
>>> class Super(object):
name = None
def __init__(self, *args, name=None, **kwargs):
self.name = name
super().__init__(self, *args, **kwargs)
>>> class Sub(Super, int):
pass
>>> Sub(5)
5
>>> Sub(5, name="Foo")
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
Sub(5, name="Foo")
TypeError: 'name' is an invalid keyword argument for this function
(. Я также попробовал без super()
вызова, но результат был тот же)
Возможно, кто-то с лучшим знанием множественного наследования может указывать на меня в правильном направлении?
Update:
Вот решение, которое я закончил с, на основе Alex's answer.
Это еще немного Hacky (по changining __new__
«подпись s частично за счет строительства), но он будет работать до тех пор, как появляется суперкласс в подклассы» ТОиР до встроенного типа и определение __new__
таким образом, позволяет мне создавать подклассы, которые работают с разными встроенными типами, без добавления отдельного __new__
к каждому из них.
>>> class Super(object):
name = None
def __new__(cls, *args, name=None, **kwargs):
inner = super().__new__(cls, *args, **kwargs)
inner.name = name
return inner
>>> class Sub(Super, int):
pass
>>> Sub(5)
5
>>> Sub(5, name="Foo")
5
>>> _.name
'Foo'
Какова цель класса 'name = None'? если вы хотите, чтобы он был там, его, вероятно, можно было бы назвать чем-то отличным от 'self.name' – msw
' __init__' здесь урезано от того, которое я использую в реальном классе, для демонстрации. Настоящий не обязательно устанавливает 'self.name' каждый раз и установка' name = None' в суперклассе предоставляет значение по умолчанию. –