Python Inheritance : Return subclass
我在一个超类中有一个函数,它返回自己的新版本。我有这个super的一个子类,它继承了特定的函数,但我希望它返回子类的一个新版本。如何对其进行编码,以便当函数调用来自父级时,它返回父级的版本,但当从子级调用时,它返回子级的新版本?
- 你为什么要区分这些类型?继承的一个特点是子类的一个实例可以作为它的超级类的一个实例。
- 该函数存在于父级中。它返回一个新对象。如果我返回父级的实例,那么它就不能访问子级的函数。但是我不能只返回子函数,因为没有其他子函数可以使用这个函数(父函数也不能真正使用这个函数)。所以我想返回一个名为它的实例。
如果new不依赖self使用classmethod:
1 2 3 4 5 6 7 8 9 10 11 12
| 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的类别:
1 2 3 4
| 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不需要在链接中显示的意义上的另一个构造器(我的用例把我带到这里也不需要)。有没有我遗漏的东西应该首选第一种方法?
- 我认为我们在事实问题上是一致的,但不是在品味上。不存在争议…
- 如果我不能控制父类的实现,我该怎么做?例如,如果我碰巧从内置的int类继承?
- @Mexmex:您仍然可以通过覆盖__new__来对int进行子类划分。例如,请参见此处。如果您试图覆盖__add__,则可以通过这种方式实现您想要的效果。或者,如果我不能正确理解你的情况,请将其作为新问题发布。
- Uuntuu。谢谢您。我不确定我的问题是否值得一个职位,也许你可以帮助决定。我想给int子类(创建一个自定义类作为某些集合算术的表示)。现在我没有使用继承,只是创建了一个自定义类,它的属性(self.int)存储了一个相应的int。然后我定义了所有的魔术方法(add等),以便对self.int属性进行操作,并返回自定义类的一个实例及其结果。继承是否可以用来省去定义self.int和所有magic方法,但当myint(1)+myint(2)时仍然返回myint(3)而不是3?
- 即使你子类化了int,iiuc,你仍然需要覆盖魔法方法,所以我不确定子类化int能获得多少好处。如果必须改变int所有的魔法方法,就没有什么可以通过继承获得的了。此外,Liskov替换原则建议"程序中的对象应可替换为其子类型的实例,而不改变程序的正确性。"因为这里似乎没有这种情况,所以您可能——同样,iiuc——不应将MyInt设为int的子类。