Python混合:*args/**kwargs vs对`\uu init的显式调用__`
我尝试使用Python混合:*args/**kwargs vs对`\uu init的显式调用__`,python,python-3.x,inheritance,multiple-inheritance,mixins,Python,Python 3.x,Inheritance,Multiple Inheritance,Mixins,我尝试使用可点击的和矩形类编写一个mixin示例,它们是按钮类的超类 目前我使用: 类可点击: 定义初始化(self,*args,**kwargs): super() self.clicks=0 def单击(自我): self.clicks=self.clicks+1 类矩形: 定义初始值(self,x0,y0,x1,y1,*args,**kwargs): super() self.upper_right=(x0,y0) 自下而上=(x1,y1) 类按钮(可单击,矩形): 定义初始化(self,
可点击的
和矩形
类编写一个mixin示例,它们是按钮
类的超类
目前我使用:
类可点击:
定义初始化(self,*args,**kwargs):
super()
self.clicks=0
def单击(自我):
self.clicks=self.clicks+1
类矩形:
定义初始值(self,x0,y0,x1,y1,*args,**kwargs):
super()
self.upper_right=(x0,y0)
自下而上=(x1,y1)
类按钮(可单击,矩形):
定义初始化(self,*args,**kwargs):
super()
但我考虑使用:
类可点击:
定义初始化(自):
self.clicks=0
def单击(自我):
self.clicks=self.clicks+1
类矩形:
定义初始化(self,x0,y0,x1,y1):
self.upper_right=(x0,y0)
自下而上=(x1,y1)
类按钮(可单击,矩形):
定义初始化(self,x0,y0,x1,y1):
矩形。uuuu初始_uuuuuuuuuuuuuuuuuo(self,x0,y0,x1,y1)
可点击。u u初始化(自)
出于某种原因,其中一个更好吗?推荐的方法(请参阅)是使用关键字参数,以避免传递哪个父参数和哪个位置参数之间的冲突
class Clickable:
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.clicks = 0
def click(self):
self.clicks = self.clicks + 1
class Rectangle:
def __init__(self, x0, y0, x1, y1, **kwargs):
super().__init__(**kwargs)
self.upper_right = (x0, y0)
self.lower_down = (x1, y1)
class Button(Clickable, Rectangle):
# No need to override __init__ if all it does
# is pass all its arguments to the next invocation
pass
b = Button(x0=0, y0=0, x1=10, y1=10)
请记住,首先接受任意关键字参数并传递它们的原因是您不知道将生成哪个类super()
,因此无法预测预期的签名
根据定义,mixin几乎应该支持协作继承,因为它们应该与多重继承一起使用,并且可能有人希望在这样的类中使用您的mixin