【发布时间】:2011-01-14 00:40:15
【问题描述】:
我有一堂课:
class A(object):
def __init__(self,a,b,c,d,e,f,g,...........,x,y,z)
#do some init stuff
我有一个子类需要一个额外的 arg(最后一个 W)
class B(A):
def __init__(self.a,b,c,d,e,f,g,...........,x,y,z,W)
A.__init__(self,a,b,c,d,e,f,g,...........,x,y,z)
self.__W=W
编写所有这些样板代码似乎很愚蠢,例如将所有 args 从 B 的 Ctor 传递到对 A 的 ctor 的内部调用,从那时起每次更改为 A 的 ctor必须应用到B的代码中的另外两个地方。
我猜 python 有一些习惯用法来处理我不知道的这种情况。你能指出我正确的方向吗?
我最好的预感是为 A 提供一种 Copy-Ctor,然后将 B 的代码更改为
class B(A):
def __init__(self,instanceOfA,W):
A.__copy_ctor__(self,instanceOfA)
self.__W=W
这将满足我的需要,因为我总是在给定父类的实例时创建子类,尽管我不确定是否可能......
【问题讨论】:
-
如果你有那么多参数,我不会使用位置参数,而是将它们全部/大部分作为 kwargs 并使用 py3 '*' 语法
def __initi__(arg1,arg2,* kwarg1=..., ..., kwargx=..., w=...)强制 kwargs(=不依赖命令)。使用def __init__(self, arg1, arg2,*, **kwargs)更短,但我不喜欢它,因为它会在 pycharm 等 IDE 中搞乱代码完成。除了一点点屏幕浪费之外,写出所有的 kwargs 有什么害处?无论如何,您都必须在文档字符串中记录它们...
标签: python constructor arguments subclass