我正在上家长课A
很少有类继承它( B
, C
,...)。
我有一些功能is_class_A
在 A
中实现,我想在 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/