gpt4 book ai didi

Python相同的代码但不同的继承

转载 作者:行者123 更新时间:2023-11-30 22:28:21 26 4
gpt4 key购买 nike

我有两个类(Parent1 和 Parent2)实现了一些方法。然后我有两个类(Child1 和 Child2),它们应该从相应的 Parent 继承并实现一些功能。问题是 Child1 和 Child2 具有完全相同的逻辑,因此我希望有人能为我指出可重用性解决方案的方向。我正在研究条件继承,但不确定,因为在我所使用的语言中这并不是真正的事情。

简单的例子只是为了获得一个想法:

# In file1
class Parent1():
def main_method(self):
# Parent 1 implementation
self.arr = [1, 2, 3]

# In file2
class Parent2():
def main_method(self):
# Parent 2 implementation
self.arr = [2, 4, 6]

# In file3
class Child1(Parent1):
def main_method(self):
Parent1.main_method(self)
# Child logic for main_method
print self.arr

# In file4
class Child2(Parent2):
def main_method(self):
Parent2.main_method(self)
# Child logic for main_method
print self.arr

最佳答案

我想到了两个选择。首先,使用 Mixin 通过继承来添加功能。我觉得这是更Pythonic 的解决方案。请注意,Mixin 需要是第一个继承类,以便它在 MRO 中排在第一位(否则将找到 Parent 方法)。

class Parent():
def main_method(self):
self.arr = [1, 2, 3]

class MethodMixin():
def main_method(self):
super(MethodMixin, self).main_method()
print(self.arr)

class Child(MethodMixin, Parent): pass

我以前见过这种方法并取得了巨大成功。例如,django-rest-framework 在其 Viewset 中使用此模式。代码。

第二个选项是使用元类在创建类时动态添加方法。

class MethodMeta(type):
def __new__(cls, name, parents, dct):
new_cls = super(MethodMeta, cls).__new__(cls, name, parents, dct)

def main_method(self):
super(new_cls, self).main_method()
print(self.arr)

new_cls.main_method = main_method
return new_cls

class Child(Parent, metaclass=MethodMeta): pass

上面的代码片段使用了 Python 3.X 元类语法。如果要在 Python 2.X 中使用元类,则必须将其添加为名为 __metaclass__ 的类变量。请注意,这种元类方法的扩展性不太好;如果你想在一个元类中添加 10 个方法,它会比 Mixin 替代方案更加困惑。

关于Python相同的代码但不同的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46621516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com