Скрытый метод вызываемый внутри класса почему-то выводит на печать self, хотя я его и не передавал

Рейтинг: 0Ответов: 2Опубликовано: 23.04.2023

Помогите пожалуйста разобраться.

class A:

    def __метод_2(*args):
        print(*args)

    def метод_1(self, *args):
        self.__метод_2(*args)


obj = A()
obj.метод_1('привет')

Хочу снаружи запустить , метод_1 класса и передать ему ряд аргументов.

В свою очередь метод_1 должен обратиться к другому, в моём случае скрытому методу __метод_2, в этом же классе, и допустим вывести полученные аргументы на печать.

Чтобы обратиться к __метод_2, мне естественно приходится обратиться к нему через self - self.__метод_2(*args), и "О ЧУДО!", кроме переданных аргументов на печать выводится и self.

<main.A object at 0x020FEB08> привет

Не могу понять как это работает и как исправить.

Ответы

▲ 1Принят

Добавьте методу 2 аргумент self

class A:

    def method2(self, *args): # <---
        print(*args)

    def method1(self, *args):
        self.method2(*args)


obj = A()
obj.method1('привет')

UPD

Как правильно заметил @n1tr0xs, аргумент передаётся автоматически.
Так что ещё как вариант - выводить только аргумент с индексом [1], игнорируя индекс [0]

class A:
    def method2(*args):
        print(args[1]) # <--

    def method1(self, *args):
        self.method2(*args)

obj = A()
obj.method1('привет')
▲ 0

Если вы не взаимодействуете с самим объектом self внутри метода и хотите его опустить, то можете воспользоваться встроенным декоратором @staticmethod

class A:
    @staticmethod
    def __method1(*args):
        print(*args)

    def method2(self, *args):
        self.__method1(*args)

a = A()
a.method2('привет')

Такой статичный метод можно вызывать как у класса C.f(), так и экземпляра C().f().