簡體   English   中英

Python新風格的類和超級函數

[英]Python New-style Classes and the Super Function

這不是我期望看到的結果:

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設置一致的值。 我不確定為什么要將kwargs插入到args中,但我要假設我要么從子類中調用__init__()錯誤,要么我正在嘗試做一些你不能做的事情。

有小費嗎?

試試這個:

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

由於A的init函數期望實際的args / kwargs(而不僅僅是兩個參數),你必須實際傳遞args / kwargs的解壓縮版本,以便它們能夠正確地重新打包。

否則,已經打包的args和kwargs的dict列表被重新打包為一個帶有兩個元素的args列表,以及一個空的kwargs dict,因為你傳遞的是一個列表和一個dict,而不是實際的未命名和命名的參數。

雖然我完全贊同戴維,你是否意識到如果B的__init__沒有其他目的而不是調用它的超級,你可以安全地省略它嗎? 我的意思是,通過您的示例,您可以簡單地將B定義為

>>> class B(A):
...      pass

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM