Передача метода экземпляра в качестве аргумента по умолчанию

#python #python-3.x #oop

Вопрос:

Возможно, это немного странно, но я хочу передать вызываемый метод экземпляра в качестве переменной по умолчанию методу экземпляра того же класса.

 from typing import Callable

class Person:

    def __init__(self, name):
        self.name = name

    def say_hi(self):
        print("Hello, my name is", self.name)

    def greet(self, func: Callable=say_hi):
        func()

p = Person("Guido")
p.greet()
 

С помощью приведенного выше решения self не передается методу экземпляра.
Замена func: Callable=say_hi на func: Callable=self.say_hi и self еще не определена.

Комментарии:

1. если вы знаете, что это метод экземпляра? почему ты его передаешь? Вы можете получить доступ к нему внутри , например self.say_hi , если вы все еще настаиваете, то вы можете d0 p.greet(p.say_hi)

Ответ №1:

Вы можете выполнить назначение в самой функции:

 def greet(self, func: Callable = None):
    func = self.say_hi if func is None else func
    func()
 

Предложение @blhsing в комментариях ниже состоит в том, чтобы использовать это (хотя быть явным немного лучше, чем неявным, но это тоже сработает).:

 func = func or self.say_hi
 

Комментарии:

1. Или func = func or self.say_hi , если вам нравится, короче. (Жаль, что в Python нет эквивалента ||= оператора Ruby.)