Использование setattr () для перегрузки метода в уже существующем определении класса - PullRequest
0 голосов
/ 09 мая 2020

Мне было интересно, можно ли добавить метод к существующему классу, перегрузив уже существующий метод. Я знаю, что могу использовать setattr () для добавления функции к классу, однако перегрузка не работает.

В качестве примера я хотел бы добавить к классу

class foo:
    def hello(self):
        print("hello")

Следующая функция, перегружающая «привет»

def hello2(self,baa):
    self.hello()
    print(str(baa))

видно, что это работает

setattr(foo,"hello2",hello2)    
test = foo()
test.hello()
test.hello2("bye")

но я хотел бы иметь возможность называть это так:

test.hello("bye")

Есть ли способ сделать это? РЕДАКТИРОВАТЬ: Спасибо всем за ответы! Для меня важно, что я действительно могу перегрузить, а не только заменить существующий метод. Я изменил свой пример, чтобы отразить это!

Ура!

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

Фактически вы можете избежать использования здесь setattr. Поскольку вы знаете метод, который хотите перегрузить заранее, вы можете сделать:

def hello2(self, baa):
    print("hello"+str(baa))

, за которым следует;

foo.hello = hello2
test = foo()
test.hello()
2 голосов
/ 09 мая 2020
class foo():
    def hello(self, baa=""):
        print("hello"+str(baa))


def main():
     test = foo()
     test.hello()
     test.hello("bye")

выведет

hello hellobye

...