python - 如何将构造函数方法传递给另一个方法并在那里调用它?

标签 python inheritance methods

我试图避免在两个类的克隆方法中重复相同的代码,一个继承自另一个。我当前的方法是将两个类共有的代码放在基类的(非静态)克隆方法中,并从扩展类中调用它。为此,我试图将扩展类的构造函数传递给基类,以便可以在那里调用它。这是我目前正在做的事情的一个简化示例:

class S(object):
    """Base class"""
    def __init__(self):
        self.a = 0

    def clone(self, constructor=None):
        if constructor is None:
            constructor = self.__init__
        cloned = constructor()
        # Expecting: cloned.a = 1, cloned.b = 7

        assert cloned is not None  # raises AssertionError
        cloned.a = self.a  # Set a to 2
        return cloned

class C(S):
    """Child class, extending Base"""
    def __init__(self):
        self.a = 1
        self.b = 7

    def clone(self):
        cloned = super(C, self).clone(self.__init__)
        # Expecting: cloned.a = 2, cloned.b = 7

        cloned.b = self.b  # Set b to 8
        return cloned

if __name__ == '__main__':
    c1 = C()
    c1.a = 2
    c1.a = 8
    c2 = c1.clone()

此时我的问题是:

  • 为什么是None调用 clone 时返回基类的方法?

  • 是否必须将方法绑定(bind)到类才能使用它,使用 types.MethodType__get__ ?

  • 您有什么更好的建议?

最佳答案

虽然 __init__() 在 Python 中通常被称为构造函数,但实际上并非如此。它获取作为 self 参数传入的实例,并返回 None。该实例是由 __new__() 方法先前构造的,它是实际的构造函数。不过,您不应传递对 __new__ 的引用。传递类型本身会更容易、更直接。

编辑:实现克隆方法的正确方法是另一种方法:坚持常用的Python协议(protocol),并实现__getstate__()。和 __setstate__()在你的实例上。然后您可以使用 copy 模块中的函数正确克隆您的实例。

关于python - 如何将构造函数方法传递给另一个方法并在那里调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11613636/

相关文章:

python - Python 'for' 循环的更好方法

python - 如何在 Python 中模拟已挂载的分区

python - 我将如何创建 Python 模块?

java - Class<T extends AnotherClass> 方法泛型

c# - 封装 VS 继承——如何使用 protected 函数?

c# - "Base abstract generic class is a bad choice in most situations."为什么? (或者为什么不)

python - 在代码中查找 numpy RuntimeWarning 的位置

c++ - 原型(prototype)方法中的参数名称(头函数中的变量名称)

java - 如何将未定义数量的方法作为参数传递给另一个方法

java - if else 语句没有停止问题