Python继承:返回子类

Python继承:返回子类,python,inheritance,Python,Inheritance,我在超类中有一个函数,它返回自身的新版本。我有一个超类的子类,它继承了特定的函数,但更希望它返回子类的新版本。如何对其进行编码,以便当函数调用来自父函数时,返回父函数的版本,但当从子函数调用时,返回子函数的新版本?如果new不依赖于self,请使用classmethod: class Parent(object): @classmethod def new(cls,*args,**kwargs): return cls(*args,**kwargs) class

我在超类中有一个函数,它返回自身的新版本。我有一个超类的子类,它继承了特定的函数,但更希望它返回子类的新版本。如何对其进行编码,以便当函数调用来自父函数时,返回父函数的版本,但当从子函数调用时,返回子函数的新版本?

如果
new
不依赖于
self
,请使用classmethod:

class Parent(object):
    @classmethod
    def new(cls,*args,**kwargs):
        return cls(*args,**kwargs)
class Child(Parent): pass

p=Parent()
p2=p.new()
assert isinstance(p2,Parent)
c=Child()
c2=c.new()
assert isinstance(c2,Child)
或者,如果
new
确实依赖于
self
,则使用
type(self)
确定
self
的类别:

class Parent(object):
    def new(self,*args,**kwargs):
        # use `self` in some way to perhaps change `args` and/or `kwargs`
        return type(self)(*args,**kwargs)

你为什么要区分这些类型。继承的一个特点是子类的实例可以充当其超类的实例。函数位于父类中。它返回一个新对象。如果我返回父对象的实例,那么它就不能访问子对象的函数。但我不能只返回子对象,因为这样其他子对象就不能使用此函数(父对象也不能)。所以我想返回一个调用它的实例。如果第二个方法在这种情况下也可以工作,那么在什么情况下应该使用第一个方法?为了让读者更清楚地了解,
new
不会变异
self
和/或
args
/
kwargs
?@nivk:classmethod的主要用途之一是。如果这是一个可以理解的约定,那么阅读您的代码的其他人也可以遵循这个约定。在这种情况下,由于第二种方法的灵活性,似乎应该首选第二种方法。我不认为OP需要一个链接中所示的替代构造函数(我的用例也不需要)。有什么我不喜欢的第一种方法吗?我想我们在事实上是一致的,但在品味上不是一致的。De gustibus non est disputandum…如果我不能控制父类的实现,我该怎么办?例如,如果我碰巧从内置的Int类继承?