Я упрощу то, что Python делает под капотом, если у вас есть код из вашего обновления, а затем запустите:
child = Child()
print(child.get_value())
child = Child.__new__(Child) # first create the object
Child.__init__(child) # then initialize it
print(child.get_value())
# `Child` doesn't have a `__new__` property, it checks the `Parent` class, which doesn't have it either, so it checks `Parent`s parent class, which is `object`, which does know how to create an object!
child = object.__new__(Child)
# look up `__init__` on Child, it doesn't exist so check the `__init__` on the base class, Parent:
Parent.__init__(child) # then initialize it
# `child` doesn't have an attribute called `get_value`, look it up on its class, it finds it!
print(Child.get_value(child)) # prints 5
Обратите внимание, что Parent.get_value
не вызывается. Если вы хотите, чтобы подклассы вызывали методы своего суперкласса, вы можете использовать super()
:
class Parent(object):
def __init__(self):
self.value = 4
def get_value(self):
self.value = self.value + 7
class Child(Parent):
def get_value(self):
super().get_value()
return self.value + 1
Если вы используете этот код, c.get_value()
вернет 12, если isinstance(c, Child)
.