【问题标题】:correct way of extending a class in python在python中扩展类的正确方法
【发布时间】:2022-01-08 23:33:05
【问题描述】:

给了我一个A-type 对象的指定工厂。我想制作一个新版本的A-type 对象,它也具有Mixin 类中的方法。由于这里解释太长的原因,我不能使用class A(Mixin),我必须使用A_factory。下面我试着举一个简单的例子。

我天真地认为从Mixin 继承并赋予A 类型的对象以mixin 方法就足够了,但是下面的尝试不起作用:

class A: pass

class A_factory:
    def __new__(self):
        return A()
        
class Mixin:
    def method(self):
        print('aha!')

class A_v2(Mixin):  # attempt 1
    def __new__(cls):
        return A_factory()

class A_v3(Mixin):  # attempt 2
    def __new__(cls):
        self = A_factory()
        super().__init__(self)
        return self

事实上A_v2().method()A_v3().method() 提高了AttributeError: 'A' object has no attribute 'method'

class A_vn(Mixin) 中使用A_factory 以使工厂创建的A 类型的对象继承mixin 方法的正确方法是什么?

【问题讨论】:

  • 为什么不class A(Mixin)?为什么需要A_factory
  • 我需要使用A_factory,因为它包含很多用于创建和初始化适当的A 的逻辑(A 类型的对象没有简单的初始化)。我只需要为这些对象添加一些功能。

标签: python initialization mixins


【解决方案1】:

对于您在此处显示的内容,没有明显的理由需要 __new__。关于这个主题有一个很好的讨论:Why is __init__() always called after __new__()?

如果您尝试以下方法,它应该可以工作:

class Mixin:
    def method(self):
        print('aha!')

class A(Mixin):
    def __init__(self):
        super().__init__()

test = A()
test.method()

如果你需要使用工厂方法,它应该是一个函数而不是一个类。这里有一个关于如何使用工厂方法的很好的讨论:https://realpython.com/factory-method-python/

【讨论】:

  • 谢谢,但这不是我要问的。我要问的是:如果我必须使用给定的对象工厂,我该如何扩展它们的功能?
  • @Ziofil 您可以编辑您的问题以更好地解释问题吗?
猜你喜欢
  • 1970-01-01
  • 2018-09-24
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2019-04-07
  • 1970-01-01
相关资源
最近更新 更多