Типичный способ добавить функциональность в функцию - это использовать декоратор (используя функцию обертывания ):
from functools import wraps
def add_message(func):
@wraps
def with_additional_message(*args, **kwargs)
try:
return func(*args, **kwargs)
finally:
print "and here"
return with_additional_message
class A:
@add_message
def test(self):
print "here"
Конечно, это действительно зависит от того, чего вы пытаетесь достичь. Я часто использую декораторы, но если бы все, что я хотел сделать, это напечатать дополнительные сообщения, я бы, вероятно, сделал что-то вроде
class A:
def __init__(self):
self.messages = ["here"]
def test(self):
for message in self.messages:
print message
a = A()
a.test() # prints "here"
a.messages.append("and here")
a.test() # prints "here" then "and here"
Это не требует метапрограммирования, но опять же ваш пример, вероятно, был значительно упрощен от того, что вам действительно нужно делать. Возможно, если вы опубликуете более подробную информацию о ваших конкретных потребностях, мы можем лучше посоветовать, какой будет подход Pythonic.
РЕДАКТИРОВАТЬ: Поскольку кажется, что вы хотите вызывать функции, вы можете иметь список функций вместо списка сообщений. Например:
class A:
def __init__(self):
self.funcs = []
def test(self):
print "here"
for func in self.funcs:
func()
def test2():
print "and here"
a = A()
a.funcs.append(test2)
a.test() # prints "here" then "and here"
Обратите внимание, что если вы хотите добавить функции, которые будут вызываться всеми экземплярами A
, тогда вы должны сделать funcs
полем класса, а не полем экземпляра, например,
class A:
funcs = []
def test(self):
print "here"
for func in self.funcs:
func()
def test2():
print "and here"
A.funcs.append(test2)
a = A()
a.test() # print "here" then "and here"