Функция перезаписи в родительском классе - PullRequest
0 голосов
/ 05 августа 2020

Я просто смотрел на этот пример , где есть код:

class Parent(object):
     def __init__(self):
         self.value = 4
     def get_value(self):
         return self.value
 
class Child(Parent):
     def get_value(self):
         return self.value + 1

Когда функция get_value запускается в классе Child, определяет ли она значение self.value, проверив, какое значение self.value было в функции init в родительском классе, или проверив, какое значение self.value было в функции get_value в классе Parent?

Обновление

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):
         return self.value + 1

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Когда вы обращаетесь к self.value в классе child, он получит текущее состояние self.value, которое находится в классе Parent. Поэтому, если он не изменен, он вернет значение в __init__ плюс 1.

Этот пример немного упрощен, но если вы добавите к нему метод setter, это будет лучше для понимания к какому значению он обращается.

Примерно так:

class Parent(object):
    def __init__(self):
        self.value = 4
    def get_value(self):
        return self.value

class Child(Parent):
    def set_value(self, x):
        self.value = x
    def get_value(self):
        return self.value + 1

c = Child()
print(c.get_value()) # 5
c.set_value(3)
print(c.get_value()) # 4
1 голос
/ 05 августа 2020

Я упрощу то, что 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...