代码之家  ›  专栏  ›  技术社区  ›  jedmao

python新样式类和超级函数

  •  2
  • jedmao  · 技术社区  · 16 年前

    这不是我希望看到的结果:

    class A(dict):
        def __init__(self, *args, **kwargs):
            self['args'] = args
            self['kwargs'] = kwargs
    
    class B(A):
        def __init__(self, *args, **kwargs):
            super(B, self).__init__(args, kwargs)
    
    print 'Instance A:', A('monkey', banana=True)
    #Instance A: {'args': ('monkey',), 'kwargs': {'banana': True}}
    
    print 'Instance B:', B('monkey', banana=True)
    #Instance B: {'args': (('monkey',), {'banana': True}), 'kwargs': {}}
    

    我只是想让类a和类b有一致的值集。我不知道为什么要把夸尔格插入args,但我想我要么打电话给 __init__() 子类中的错误,或者我试图做一些你做不到的事情。

    有什么小窍门吗?

    2 回复  |  直到 15 年前
        1
  •  14
  •   Amber    16 年前

    请改为:

    super(B, self).__init__(*args, **kwargs)
    

    因为a的init函数需要实际的args/kwargs(而不仅仅是两个参数),所以必须实际向它传递args/kwargs的解包版本,以便正确地重新打包它们。

    否则,由于传递的是列表和dict,而不是实际的未命名和命名参数,因此已打包的args和kwargs dict列表将重新打包为包含两个元素的args列表和空kwargs dict。

        2
  •  2
  •   krawyoti    16 年前

    虽然我完全同意大卫的观点,但你是否意识到 __init__ B除了调用它的super没有其他用途,您可以安全地省略它吗?我的意思是,用你的例子,你可以简单地定义b为

    >>> class B(A):
    ...      pass
    
    推荐文章