Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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 我可以在抽象基类中使用kwargs,但在子类中使用特定参数吗?_Python_Abc - Fatal编程技术网

Python 我可以在抽象基类中使用kwargs,但在子类中使用特定参数吗?

Python 我可以在抽象基类中使用kwargs,但在子类中使用特定参数吗?,python,abc,Python,Abc,Python 3.7+:我试图用抽象方法定义ABC: 从abc导入abc,abstractmethod A类(ABC): @抽象方法 def f(自身,x,**kwargs): 通过 我想在子类中明确定义每个子类支持的特定参数: B(A)类: def f(自身、x、y): 打印(x,y) B() 我在滥用语言吗?除了不改变传递**kwargs之外,还有更好的方法吗?我想要以一种更固定、更明确的方式定义一些东西,比如文档中的标准参数和:param:,而不是将参数描述为字符串并通过字符串从**k

Python 3.7+:我试图用抽象方法定义ABC:

从abc导入abc,abstractmethod
A类(ABC):
@抽象方法
def f(自身,x,**kwargs):
通过
我想在子类中明确定义每个子类支持的特定参数:

B(A)类:
def f(自身、x、y):
打印(x,y)
B()


我在滥用语言吗?除了不改变传递
**kwargs
之外,还有更好的方法吗?我想要以一种更固定、更明确的方式定义一些东西,比如文档中的标准参数和
:param:
,而不是将参数描述为字符串并通过字符串从
**kwargs

中查找。您能澄清一下为什么要使用
**kwargs
?如图所示的代码表明,对于任何
a:a
调用例如
a.f(x=1,y=2,z=3)
都是有效的,这对于
B
的实例无效。我使用
**kwargs
,因为确切的参数是特定于子类的,这应该保持不变。我试图避免的是在
B
中使用
**kwargs
。很难判断您应该做什么,因为这个示例并没有真正捕获任何意图。定义这样的类是可以的,通常从实用的角度来看,这是非常好的。但请注意,子类化(如中)的含义被违反,因此,在某些情况下,这会产生奇怪/错误的行为–问题在于您是否实际命中/需要这些情况。更具体地说,“确切的参数是子类特有的”对于ABC来说没有多大意义——ABC的整个要点是定义需要哪些方法,包括它们的参数。当用户必须查找每个具体实现需要什么时,ABC是没有意义的。如果您只想将一些类似的类型收集到一个中,则使用
typing.Union
更合适(并且是Python 3.10+中支持的运行时“东西”)。该示例过于简单,我们不必问太多为什么,让我们试着将重点放在这个问题上
A.f
有一些在整个层次结构中通用的参数(示例中为
x
),还有一些不太严格且子类特定的可选参数,以进一步优化
f
的行为。这在Python中很好。通过
**kwargs
而不做任何更改是完全可以的。我只是想问,是否有更好的方法来建模
B.f
签名中特定于子类的附加参数。