在下面的示例中,我展示了一些可能使用*args或不使用的 mixin **kwargs:
class AMixin():
def __init__(self, **kwargs):
print("AMixin")
self.a = 'a' str(kwargs.get('a', ''))
class BMixin():
def __init__(self, **kwargs):
print("BMixin")
self.b = 'b' str(kwargs.get('b', ''))
class ABMixin(AMixin, BMixin):
def __init__(self, **kwargs):
print("ABMixin")
super().__init__(**kwargs)
class A(AMixin):
def __init__(self, **kwargs):
super().__init__(**kwargs)
class B(BMixin):
def __init__(self, **kwargs):
super().__init__(**kwargs)
class AB(ABMixin):
def __init__(self, **kwargs):
print("AB")
super().__init__(**kwargs)
AB(a='a', b='b')
在這里我遇到了一個問題,因為最后一個 mixin 正在呼叫其不存在的父級:
Cell In [4], line 9, in BMixin.__init__(self, *args, **kwargs)
8 def __init__(self, *args, **kwargs):
----> 9 super().__init__(*args, **kwargs)
10 print("BMixin")
11 self.b = 'b' str(kwargs.get('b', ''))
TypeError: object.__init__() takes exactly one argument
(the instance to initialize)
我應該如何修改這個示例以允許任何混合組合,并以任何順序繼承混合?
一種可能的 UGLY 解決方案是添加一個虛擬的 end mixin:
class EndMixin:
def __init__(self, **kwargs):
...
class AMixin(EndMixin):
def __init__(self, **kwargs):
print("AMixin")
self.a = 'a' str(kwargs.get('a', ''))
class BMixin(EndMixin):
def __init__(self, **kwargs):
print("BMixin")
self.b = 'b' str(kwargs.get('b', ''))
uj5u.com熱心網友回復:
你可以讓你的 mixins 從一個停止對object.
class BaseMixin:
def __init__(self, *args, **kwargs):
pass
class AMixin(BaseMixin):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print("AMixin")
self.a = 'a' str(kwargs.get('a', ''))
class BMixin(BaseMixin):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print("BMixin")
self.b = 'b' str(kwargs.get('b', ''))
class ABMixin(AMixin, BMixin):
...
class A(AMixin):
...
class B(BMixin):
...
class AB(ABMixin):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
obj = AB(a='a', b='b')
print(obj.b)
print(obj.a)
uj5u.com熱心網友回復:
看起來每個混合都應該擁有它所操作的引數的所有權。顯式宣告引數(如果您愿意,僅使用關鍵字),然后處理您的混入不知道**kwargs的關鍵字引數。
class AMixin:
def __init__(self, *args, a='', **kwargs):
super().__init__(*args, **kwargs)
print("AMixin")
self.a = 'a' str(a)
class BMixin:
def __init__(self, *args, b='', **kwargs):
super().__init__(*args, **kwargs)
print("BMixin")
self.b = 'b' str(b)
class A(AMixin):
pass
class B(BMixin):
pass
class AB(ABMixin):
def __init__(self, **kwargs):
print("AB")
super().__init__(**kwargs)
AB(a='a', b='b')
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/529249.html
標籤:Python哎呀性状混入
