【发布时间】:2019-09-06 05:31:38
【问题描述】:
我知道有十亿个关于 *args、**kwargs 和 super() 的问题。这特别是为了获得一个清晰的help() 函数。
我有一个基类:
class Base(object):
def __init__(self, arga, argb, kwargc=1):
self.arga = arga
self.argb = argb
self.kwargc = kwargc
我派生这个类,我希望它拥有所有现有的初始化参数,但我也希望它接受更多。例如:
class Derived(Base):
def __init__(self, *args, kwargd=2, **kwargs):
super(Derived,self).__init__(*args, **kwargs)
self.kwargd = kwargd # the one I add in the subclass
当我定义和检查一个基础对象时:
>>> b = Base(1,2)
>>> b.arga
1
我得到了这个非常有用的信息:
>>> help(b)
Help on Base in module __main__ object:
class Base(builtins.object)
| Base(arga, argb, kwargc=1)
|
| Methods defined here:
|
| __init__(self, arga, argb, kwargc=1)
| Initialize self. See help(type(self)) for accurate signature.
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
但是,当我定义派生类 d:
>>> d = Derived(2,4,kwargd=8)
>>> d.arga
2
>>> d.argb
4
>>> d.kwargc # great, this came for free as expected!
1
>>> d.kwargd
8
...我发现help(d) 没有什么帮助:
>>> help(d)
Help on Derived in module __main__ object:
class Derived(Base)
| Derived(*args, kwargd=2, **kwargs)
|
| Method resolution order:
| Derived
| Base
| builtins.object
|
| Methods defined here:
|
| __init__(self, *args, kwargd=2, **kwargs)
| Initialize self. See help(type(self)) for accurate signature.
|
| ----------------------------------------------------------------------
| Data descriptors inherited from Base:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
在这里突出问题:
class Derived(Base)
| Derived(*args, kwargd=2, **kwargs)
仅仅说“*args”并不像它告诉我它们被称为arga 和argb 那样提供信息。同样,我想知道kwargc是定义的,而不仅仅是**kwargs。
所以,我真的更希望获得诸如 arga、argb 和 kwargc=1 的名称之类的信息,就像我在 Base 类中看到的那样 .
此外,我不希望将它们显式写出来 --- DRY 这就是我对子类化感兴趣的原因,而不仅仅是第二次编写类并重写函数 init 参数。
有没有一种好的内置方法可以做到这一点?如果不是,我可以从 Base 对象中提取这些信息以智能填充帮助的最优雅方式是什么,以便用户在检查 help 时知道进入子类的参数的名称?
【问题讨论】:
标签: python-3.x oop inheritance