Python 将父级设置为实例

标签 python python-3.x inheritance

有没有办法将父对象设置为特定实例?我有一个实用程序可以为我初始化一个复杂的对象,我想让它初始化一些对象以进行模拟。示例:

class ComplexObject:
   def __init__(arg1, arg2, arg3):
       #do some stuff
       return

class ComplexObject_Mock(ComplexObject):
    def __init__():
        complexObject = ComplexObjectFactory.NewComplexObject()
        return super() = complexObject

现在我知道上面的代码不起作用,因为最后一行。通常我使用 super().__init(arg1, arg2, arg3) 创建父类的实例,但我只想将实例设置为工厂初始化的内容.

最佳答案

首先,这一行存在多个问题:

return super() = complexObject
  • 您不能在返回内进行赋值(或任何其他语句),只能在表达式中进行。
  • 您不能对函数调用的结果进行赋值,只能对可命名的目标(变量、对象的属性、列表中的索引等)进行赋值。
  • 如果您可以对函数调用的结果进行赋值,那不会有任何用处。您只需将一些不可见的临时名称重新绑定(bind)到不同的值即可。
  • 即使可以,super() 也会返回一个特殊的魔术代理对象,因此强制它返回一些其他不知道如何像 super 一样工作的对象> 只会破坏一切。
  • 最后,super() 返回的是 self 的代理。如果您以某种方式将其代理为一个完全不相关的对象,那么您在 super() 上调用的每个方法最终都会访问并改变该完全不相关的对象的属性,这对 self

此外,__init__是一个普通方法,需要一个self,否则无法调用。

同时,如果您尝试更改对象的创建方式,而不仅仅是其初始化方式,则必须使用 __new__,而不是 __init__

最后,模拟的重点是您不必必须创建一个ComplexObject;你正在创建的东西行为就像一个人,但不是一个人,所以整个事情一开始就没有多大意义。

这是一种疯狂的猜测,但我认为您在这里真正想要的是一个拥有一个ComplexObject的代理对象,并且还假装自己是其中一员,委派一些调用并自行处理其他调用。换句话说:

class ComplexObject_Mock(ComplexObject):
    def __init__(self):
        self.complexObject = ComplexObjectFactory.NewComplexObject()
    def method_to_delegate(self, arg):
        # instead of return super().method_to_delegate(arg)
        return self.complexObject.method_to_delegate(arg)
    def method_to_steal(self, arg):
        # don't call self.complexObject.method_to_steal
        # just as you wouldn't have called super().method_to_steal
    def method_to_hook(self, arg):
        arg = self._preprocess(arg)
        # instead of result = super().method_to_hook(arg)
        result = self.complexObject.method_to_hook(arg)
        return self._postprocess(result)

关于Python 将父级设置为实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51827513/

相关文章:

python - 如果 Django ORM 要使用错误的 PK 值,是否需要自定义 ForeignKey 子类?

python-3.x - 如何从python中的列表中删除特殊字符

python - 字典和类

python - OpenCV 4 TypeError:参数 'labels' 的预期 cv::UMat

python - 属性直接在某些子项中定义,属性在其他子项中定义

python - 使用 numpy interp 右

python - 合并 2 个没有标题的表(有公共(public)列)

c++ - 在 C++ 中初始化静态 std::map<int, unique_ptr<int>>

python - 2^i-1 形式数字的 GCD

javascript - 创建原型(prototype)链最安全、跨浏览器广泛支持的方法是什么?