#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