簡體   English   中英

如何擴展大類方法?

[英]How to Extend Large Class Methods?

如果要擴展一個類及其相應的__init__方法,是否可以處理包括新參數在內的大量參數? 例如:

class Thing:
    def __init__(self, arg1, arg2, arg3, arg4):
        # Initialize 

class SubThing(Thing):
    def __init__(self, arg1, arg2, arg3, arg4, ex_arg1, ex_arg2):
        super().__init__(arg1, arg2, arg3, arg4):
        # Do extra initialization 

是否可以縮短子類的__init__方法的參數列表? 像這樣的回答這一個沒有描述如何將參數添加到init,或者如何處理額外的關鍵字參數,例如__init__(self, arg1, arg_room='Bedroom', ex_arg1, ex_position=(0, 0), ex_arg2)

真正沒有一種做您想要的事情的方法。 一般來說,命名所有參數是主要的方法。

有一些方法可能會有所幫助。 一種是將一些參數捆綁到更大的集合中,因此您只需要將一項傳遞給父類,而不是多項。 使用可迭代序列保存arg1 - arg4可能看起來像這樣,但您可能想改用自定義類(有關將其他類型的多個參數捆綁在一起的類型的示例,請參閱csv模塊中的Dialect類) :

def __init__(self, thing_args, ex_arg1, ex_arg2):
    super().__init__(*thing_args)
    # ...

另一種方法是使用*args和/或**kwargs接收要傳遞的參數。 使用位置*args是相當有限的,因為您必須在傳遞的所有參數之前列出子類中您關心的參數:

def __init__(self, ex_arg1, ex_arg2, *args):
    super().__init__(*args)
    # ...

ex_argsN者將需要首先列出ex_argsN參數的值,這可能是不自然的。 子類越多,情況就越糟。

要求將所有參數作為關鍵字參數傳遞可能會更好,因為調用方可以按最自然的順序放置關鍵字參數:

def __init__(self, *, ex_args1, ex_args2, **kwargs):
    super.__init__(self, **kwargs) # passes along the unnamed keyword args
    # ...

這種方法的最大缺點是,使用所有參數名稱的調用變得非常冗長:

st = SubThing(arg1="foo", arg2="bar", arg3="baz", arg4="quux",
              ex_arg1=1, ex_arg2=6.02e23)

您可以執行與引用的答案類似的操作,除了刪除特定於您的子類的項。

class Thing:
    def __init__(self, arg1, arg2, arg3, arg4, kw1=None, kw2=None):
        print('Thing args:',arg1,arg2,arg3,arg4)
        print('Thing kw:',kw1,kw2)

class SubThing(Thing):
    def __init__(self, *args, **kw):
        """SubThing(arg1, arg2, arg3, arg4, arg5, arg6, kw1=None, kw2=None,
        kw3=None, kw4=None)
        """
        if len(args) != 6:
            raise TypeError(
                "SubThing() takes 6 positional arguments but {} were given"
                .format(len(args)))
        arg5, arg6 = args[4:]
        kw3 = kw.pop('kw3', None)
        kw4 = kw.pop('kw4', None)
        super().__init__(*args[:4], **kw)


SubThing(1,2,3,4,5,6,kw1='kw1',kw4='kw4')
print('---- but populating kwargs from positional args stops working ----')
Thing(1,2,3,4, 'kw1', 'kw2')
SubThing(1,2,3,4,5,6,'kw1','kw2')

這導致

Thing args: 1 2 3 4
Thing kw: kw1 None
---- but populating kwargs from positional args stops working ----
Thing args: 1 2 3 4
Thing kw: kw1 kw2
Traceback (most recent call last):
  File "n.py", line 24, in <module>
    SubThing(1,2,3,4,5,6,'kw1','kw2')
  File "n.py", line 14, in __init__
    .format(len(args)))
TypeError: SubThing() takes 6 positional arguments but 8 were given

請注意,在第二個示例中,您失去了一些功能,因為多余的位置參數沒有自動填充關鍵字參數。 您可以使用更多編碼來解決該問題,也可以接受限制。 許多使用*args, **kw忘記這樣做,因此您的關系很好。

暫無
暫無

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

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