簡體   English   中英

運行超級 class 方法后如何返回子 class 實例?

[英]How do I return a child class instance after running a super class method?

我有 2 個 python 類,一個是另一個的子類

class A:
    def __init__(some params):
        do something()

    def method(params):
        return A_new_A_instance

class B(A)
    def __init__(some params):
        super().__init__(some params)

    def new_method(params):
        a_instance=super.method(params)
        return B(a)
        

對於我經常使用的一些方法,上面的方法效果很好。

問題是 class A 有很多方法,有些我正在使用,有些我正在修改,等等。還有一些我不關心。 A 中的大多數方法返回 A 的另一個實例(例如選擇、添加、重新排序數據)但是我想確保無論我調用哪個A.method()我都想在執行B.method()時返回 B 的實例B.method()

是否有一種神奇的方法可以對 A 的所有方法執行此操作,還是我需要一個一個地完成它們?

只要AB的構造函數相同(它們采用相同的參數),您就可以使用工廠 function 創建A新實例並為B覆蓋它:

class A:
    def __init__(self, *params):
        pass

    def _create_new_instance(self, *params):
        return A(*params)

    def method(self, *params):
        # this will either call A._create_new_instance or
        # B._create_new_instance depending on type(self)
        return self._create_new_instance(*params)

class B(A):
    def __init__(self, *params):
        super().__init__(self, *params)

    def _create_new_instance(self, *params):
        return B(*params)

    def new_method(self, *params):
        new_b = self.method(*params)
        do_something_new(new_b)
        return new_b

assert isinstance(A().method(), A)
assert isinstance(B().method(), B)

我想我沒有正確表達我的問題。

我一直在尋找一種方法來使用子類中超類中的現有方法,而不知道它們是什么(或懶得知道)。

我想出的解決方案如下:

有一個 function 查詢超類中的可用方法

def get_methods(class_instance):
    method_list = [attribute for attribute in dir(class_instance) if callable(getattr(class_instance, attribute))
                   and attribute.startswith('__') is False]
    return 

然后你可以把這樣的東西放在__init__中,以將這些方法放入子類中。 我正在避免使用__方法,因為我不關心其中的大部分方法,並且還想稍后自己設置其中的一些方法,例如__str____add__

methods=get_methods(super())
        for method_name in methods:
            method = getattr(super(), method_name)
            self.__setattr__(method_name, classmethod(method))

暫無
暫無

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

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