【问题标题】:Subclassing and preserving the names of args and kwargs in python in help()在 help() 中子类化和保留 python 中 args 和 kwargs 的名称
【发布时间】:2019-09-06 05:31:38
【问题描述】:

我知道有十亿个关于 *args**kwargssuper() 的问题。这特别是为了获得一个清晰的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”并不像它告诉我它们被称为argaargb 那样提供信息。同样,我想知道kwargc是定义的,而不仅仅是**kwargs

所以,我真的更希望获得诸如 argaargbkwargc=1 的名称之类的信息,就像我在 Base 类中看到的那样 .

此外,我不希望将它们显式写出来 --- DRY 这就是我对子类化感兴趣的原因,而不仅仅是第二次编写类并重写函数 init 参数。

有没有一种好的内置方法可以做到这一点?如果不是,我可以从 Base 对象中提取这些信息以智能填充帮助的最优雅方式是什么,以便用户在检查 help 时知道进入子类的参数的名称?

【问题讨论】:

    标签: python-3.x oop inheritance


    【解决方案1】:

    不,这是不可能的,因为Derived 具有完全另一个签名,并且与Base 没有任何相似之处,除了派生方法和属性(如果它们没有被重新定义)。

    如果您想使用相同的参数 - 请使用相同的定义签名。否则你会得到Adapter pattern

    【讨论】:

      猜你喜欢
      • 2020-09-16
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 2016-08-30
      • 1970-01-01
      相关资源
      最近更新 更多