Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python混合:*args/**kwargs vs对`\uu init的显式调用__`_Python_Python 3.x_Inheritance_Multiple Inheritance_Mixins - Fatal编程技术网

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