Как вызвать метод из родительского класса python?
Для вызова метода из родительского класса в Python есть два способа:
- Явное обращение к методу предка
- Функция super()
class Counter: def __init__(self): self.value = 0 def inc(self): self.value += 1 def dec(self): self.value -= 1 # Создаем класс-потомок, при вызове inc увеличивающих значение дважды # Вариант 1 - с прямым обращением к предку: class DoubleCounter(Counter): def inc(self): Counter.inc(self) # явно обращаемся к методу класса предка Counter.inc(self) # и передаем ссылку на экземпляр # Вариант 2 - с применением функции super(): class DoubleCounter(Counter): def inc(self): super().inc() super().inc() num = DoubleCounter() num.value # 0 num.inc() # В обоих случаях, наследованный метод inc() будет работать одинаково num.value # 2
Функция super() названа в честь названия класса-предка: «superclass». Потому что благодаря ей мы получаем ссылку на атрибут предка и заменяем обращение self , создавая таким образом связанный с текущим классом метод, который будет полноценной «оригинальной версией» из класса-предка. При чем если предок сменится, то super в описании класса учтет изменения, и мы получим доступ к поведению нового предка.
Вызвать метод класса в этом же классе python
Учу ооп в питон, столкнулся с ошибкой, которую не понимаю. Я хочу вызвать метод класса внутри него самого, но получаю ошибку NameError: name ‘self’ is not defined Мой код:
class Cat: def __init__(self,name='Alex'): self.name=name def prnt(self): print(self.name) self.prnt() p1=Cat()
Отслеживать
задан 21 апр 2020 в 10:27
25 1 1 серебряный знак 8 8 бронзовых знаков
self.prnt() у вас не находится ни в каком методе, только в методах есть доступ к self . Если нужно чтобы метод prnt вызывался при создании объекта, делайте вызов self.prnt() в конце метода __init__ .
21 апр 2020 в 10:30
Что означает «вызвать метод класса внутри него самого»? Когда именно этот метод должен вызываться? В какой момент?
21 апр 2020 в 10:41
@Эникейщик мне необходимо что бы при создании экземпляра класса происходили действия описанные в методах.
21 апр 2020 в 10:51
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
При создании экземпляра класса выполняется только __init__() , поэтому можете добавить туда необходимую инструкцию:
def __init__(self, name='Alex'): self.name = name print(self.name)
Если же хочется именно метод класса, то вызвать его в __init__() :
class Cat: def __init__(self, name = 'Alex'): self.name = name self.prnt() def prnt(self): print(self.name)
Как вызвать метод класса без вызова экземпляра?
Подскажите пожалуйста, как возможно вызывать методы без вызова экземпляра класса?
Сейчас у меня реализована функция get_items_list() , она является @classmethod, но мне кажется я делаю это не совсем правильно, вызывая экземпляр внутри функции, но по другому переменные при инициализации не получить. Думал вынести их в атрибуты, но насколько это правильно делать?
На выходе хотелось бы иметь класс для работы с API(OzonRequester) методами, каждый метод (относящийся к запросу определённого API метода) которого можно будет вызывать без инициализации OzonRequester в других классах или модулях.
class OzonRequester(requests.Session): """Doc.""" __API_KEY = os.getenv('MP_Api_Key_Ozon') __CLINET_ID = os.getenv('MP_Client_Id_Ozon') __slots__ = ['__token', '__client_id'] def __init__(self) -> None: """Doc.""" super().__init__() self.base_url = ozon_base_url self.__token = self.__API_KEY self.__client_id = self.__CLINET_ID self.headers.update(< "Host": "api-seller.ozon.ru", "Content-Type": "application/json", "Client-Id": self.__client_id, "Api-Key": self.__token>) @classmethod def get_items_list(cls): """Doc.""" from config import ozon_items_list session = cls() headers = session.headers req_body = response = session.post(urljoin(session.base_url, ozon_items_list), headers=headers, json=req_body)
- Вопрос задан 16 июл.
- 265 просмотров
2 комментария
Простой 2 комментария
Сергей delphinpro @delphinpro
Послушайте, в правилах, пункт 3.1, не просто так написано, что не следует ставить много тегов к вопросам.
Я не подписан на питон, и не хочу его видеть в своей ленте. Но из-за тега ООП вопрос ваш мне попался.
А зачем здесь нужен тег ООП, если речь идет конкретно о том, как это сделать в питоне?

Rett-oo @Rett-oo Автор вопроса
Сергей delphinpro, Здравствуйте, насколько я знаю, Python не является подмножеством ООП, поэтому я указал python, как язык моего примера, и ответ на котором мне будет предпочтительнее. Но если мне ответили бы с примером на другом языке, я бы это так же смог понять. ООП же я использовал именно потому, что в данном вопросе я пытался создать класс с наследованием от другого класса, методы которого использовали методы родительского класса и мне нужно было узнать как правильно использовать classmethod
Решения вопроса 1

Data Analyst
Обычно методы класса используются для объявления альтернативных конструкторов класса, так называемые factory methods. То есть класс метод обычно возвращает cls(*args, **kwargs) Вызывается просто MyClass.classmeth(*args, **kwargs)
Вот например в pandas (у тебя был вопрос, значит используешь библиотеку) есть класс DataFrame. Ты можешь создать экземпляр класса DataFrame(data) А можешь использовать методы класса для альтернативного метода создания экземпляра (из другой структруры) DataFrame.from_dict(some_dict) так вот from_dict это метод класса.
Метод класса он оперирует на уровне класса и не имеет доступа к экземпляру класса. Есть еще статические методы, это по сути python функция которая «связана с классом» но не имеет доступа не экземпляру не к классу.
В чем у тебя здесь смысл попытки использовать методы класса лично мне не понятно. Потому что обычно вызвав метод класса мы инициализируем экземпляр с динамически измененным (данным методом) состоянием класса. Например мы можем поменять значение атрибута класса. Вот тебе на скорую руку бесполезный пример.
class MyClass: currency = 'Dollar' def __init__(self, amaunt): self.amaunt = amaunt def __str__(self): return f'MyClass()' @classmethod def euro(cls, amount): cls.currency = 'Euro' return cls(amount) dollar = MyClass(100) print(dollar) euro = MyClass.euro(100) print(euro)
Если снова вызовешь print(dollar), то он тебе выведет euro. Потому что атрибут класса общий для всех экземпляров оказался измененным.
Как вызвать метод родительского класса из дочернего класса в Python
Создание иерархий объектов — это общепринятая практика в объектно-ориентированном программировании, которая позволяет упростить и упорядочить код. Однако, иногда возникают ситуации, когда в дочернем классе требуется вызвать метод родительского класса. Применение этого подхода может быть полезным, когда нужно дополнить или переопределить функциональность, предоставляемую родительским классом.
В качестве примера возьмем следующий код:
class ParentClass: def method(self): print("This is a method from ParentClass") class ChildClass(ParentClass): def method(self): print("This is a method from ChildClass")
Если мы создадим объект класса ChildClass и вызовем метод method() , то получим сообщение «This is a method from ChildClass». Но что если нам нужно вызвать method() из ParentClass ?
В Python есть специальное ключевое слово super() , которое позволяет обращаться к родительскому классу. Чтобы вызвать метод родительского класса из дочернего, нужно использовать конструкцию super().method() . В нашем примере это будет выглядеть следующим образом:
class ChildClass(ParentClass): def method(self): super().method() print("This is a method from ChildClass")
Теперь, при вызове method() для объекта класса ChildClass , сначала будет вызван метод method() из ParentClass , а затем — из ChildClass .
Использование super() позволяет улучшить гибкость и масштабируемость кода. В частности, оно упрощает создание иерархий классов, так как дочерний класс не нужно изменять при изменении родительского.
