python - 如何在多个类中重写而不重复代码 (Python)

标签 python inheritance overriding code-duplication

我正在上家长课A很少有类继承它( BC ,...)。

我有一些功能is_class_AA 中实现,我想在 B 中覆盖它和C以同样的方式。

比方说:

class A:
    def is_class_A():
        print("We are in class A")

class B(A):
    def is_class_A():
        print("Nope")

class C(A):
    def is_class_A():
        print("Nope")

记住在类 A 中实现的两个函数而在其他情况下,则很长且更复杂。

我想到了 2 个解决方案,以避免 B 中的重复, C实现:

在类里面使用C :

def is_class_A():
    return B.is_class_A()

我不确定这将如何发挥作用,因为 C 的对象不是 B 的对象。我不会在这里传递任何self ,所以我不知道这是如何工作的,也许类似的东西可以?

下一个解决方案是使用另一种遗产:

class C(B)

这并不总是有效,因为并不总是可行(如果它们具有不同的属性)并且可能不符合设计目的。

到目前为止,我最好的尝试是使用另一个类:

class BC(A):
    def is_class_A():
        print("Nope")

class B(BC):
    pass

class C(BC):
    pass

你觉得怎么样?还有一些想法吗?也许是一些更技术性的东西,不涉及程序设计?

谢谢。

最佳答案

一种选择是在全局范围内定义一次替代方法,然后直接进行类属性分配。

class A:
    def is_class_A(self):
        print("We are in class A")


def alt_is_class_A(self):
    print("Nope")


class B(A):
    is_class_A = alt_is_class_A


class C(A):
    is_class_A = alt_is_class_A


class D(A):
    pass  # No override

分配也可以由装饰器处理:

def mod_it(cls):
    cls.is_class_A = alt_is_class_A


@mod_it
class B(A):
    pass


@mod_it
class C(A):
    pass


# No override
class D(A):
    pass

或通过A.__init_subclass__:

class A:
    def is_class_A(self):
        print("We are in class A")

    def __init_subclass__(cls, is_class_A=None):
        super().__init_subclass__()
        if is_class_A is not None:
            cls.is_class_A = is_class_A


def alt_is_class_A(self):
    print("Nope")


class B(A, is_class_A=alt_is_class_A):
    pass


class C(A, is_class_A=alt_is_class_A):
    pass


# No override 
class D(A):
    pass

关于python - 如何在多个类中重写而不重复代码 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68177611/

相关文章:

helper - Spree 覆盖辅助方法

python - 在Python中查找扩展名为.txt的目录中的所有文件

python - 最Pythonic的方式来处理(1)对象类型的一般属性和(2)该对象实例的单独属性

jquery - 使用 !important 标签覆盖类

c# - 具有继承类型的列表的序列化

java - 如何使用子类型? - Java 中的重写和继承

java - 输出未按预期显示

android - TFLite 演示模型上的静态图像精度低

python - Django Rest Framework 不像标准 POST 请求那样解码 Multipart 请求中的 JSON 字段

java - Java 中的每个子类都继承自两个类(Object 及其父类(super class))?