繁体   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