Python — Могу ли я изменить метод во время выполнения?

#python

#python

Вопрос:

Можно ли изменить метод во время выполнения? Допустим, у меня есть класс A , у которого есть метод func1(some_param) . Можно ли изменить этот func1(some_param) метод и, скажем, добавить строку print('HelloWorld') в начале?

У меня было несколько экспериментов с переопределением этого метода, обратившись к нему следующим A.func1 образом, но я застрял на стадии вставки в него строки.

Вот пример класса

 class A:
    def __init__(self, some_field):
        self.some_field = some_field
        
    def func1(self, param):
        self.some_field = param
 

И во время выполнения я хочу достичь этого класса:

 class A:
    def __init__(self, some_field):
        self.some_field = some_field
        
    def func1(self, param):
        print('HelloWorld')
        self.some_field = param
 

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

1. Почему вы просто не пишете второй код с самого начала?

2.Вам нужно изменить метод? Не могли бы вы просто создать класс B , который расширяет A и переопределяет func1 метод (вызывая родительский метод, если это необходимо)?

3. Похоже, вам нужен декоратор…

4. geeksforgeeks.org/monkey-patching-in-python-dynamic-behavior Но серьезно, не делайте этого, если вам действительно не нужно.

5. Спасибо всем mkrieger1 Я столкнулся с этой проблемой во время урока программирования, который я беру, так что это действительно проще, но это противоречит определению задачи 🙂 RocketHazmat Это хорошая идея, которая у меня была, но такая же, как и в предыдущем комментарии, также в соответствии с определением задачи, мне нужно сохранить исходный класс, просто чтобы изменить его

Ответ №1:

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

Ответ №2:

Да, это возможно. Python очень динамичен в этом смысле

Код:

 class A:
    def __init__(self, some_field):
        self.some_field = some_field
        
    def func1(self, param):
        self.some_field = param

def func2(self, param):
    print('HelloWorld')
    self.some_field = param        

def func1(self, param):
    print('stand alone func')
    self.some_field = param        
    
a = A('init')
a.func1('for func1')
A.func2 = func2
a.func2('for func2')

A.func1 = func1     # you know this is not good programming practice
a.func1('for new func1')
 

Вывод:

 HelloWorld
stand alone func