super()
для вызова методов родительского класса:
class Parent:
def __init__(self, value):
self.value = value
class Child(Parent):
def __init__(self, value, extra):
super().__init__(value)
self.extra = extra
def get_parent_value(self):
return super().value # Доступ к атрибуту value родительского класса
Или, напрямую через имя родительского класса (не рекомендуется, т.к. нарушает принципы инкапсуляции и затрудняет рефакторинг):
class Parent:
def __init__(self, value):
self.value = value
class Child(Parent):
def __init__(self, value, extra):
Parent.__init__(self, value)
self.extra = extra
def get_parent_value(self):
return Parent.value # Прямой доступ, но не рекомендуется
Существует несколько способов получить доступ к атрибутам родительского класса из дочернего класса в Python:
super()
: super()
возвращает временный объект родительского класса, позволяя вам вызывать его методы и получать доступ к его атрибутам. Это наиболее предпочтительный и идиоматичный способ.
class Родитель:
атрибут_родителя = "Значение родителя"
def метод_родителя(self):
return "Сообщение от родителя"
class Дочерний(Родитель):
def получить_атрибут(self):
return super().атрибут_родителя # Доступ к атрибуту родителя
def вызвать_метод(self):
return super().метод_родителя() # Вызов метода родителя
дочерний_объект = Дочерний()
print(дочерний_объект.получить_атрибут()) # Вывод: Значение родителя
print(дочерний_объект.вызвать_метод()) # Вывод: Сообщение от родителя
Преимущества:
.
, например, Родитель.атрибут
или Родитель.метод(self)
.
class Родитель:
атрибут_родителя = "Значение родителя"
def метод_родителя(self):
return "Сообщение от родителя"
class Дочерний(Родитель):
def получить_атрибут(self):
return Родитель.атрибут_родителя
def вызвать_метод(self):
return Родитель.метод_родителя(self)
дочерний_объект = Дочерний()
print(дочерний_объект.получить_атрибут())
print(дочерний_объект.вызвать_метод())
Недостатки:
super()
. Рекомендуется избегать этого способа.__class__.__bases__
(редко используется): Этот атрибут содержит кортеж с базовыми классами текущего класса. Однако, прямой доступ через этот атрибут обычно не рекомендуется, так как это считается низкоуровневым решением и менее читабельным. Лучше использовать super()
.
class Родитель:
атрибут_родителя = "Значение родителя"
class Дочерний(Родитель):
def получить_атрибут(self):
return self.__class__.__bases__[0].атрибут_родителя
дочерний_объект = Дочерний()
print(дочерний_объект.получить_атрибут()) # Вывод: Значение родителя
Недостатки:
Рекомендация: Всегда используйте super()
, если это возможно. Это лучший способ получить доступ к атрибутам и методам родительского класса, особенно в сложных иерархиях наследования.