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