To co chcesz zrobić to tak naprawdę wzorzec strategii. Jeśli tak, to w języku Python należy i jest to naturalne użyć wstrzyknięcia metody. Ten język oferuje taki dynamizm. Trzeba jednak rozważyć czy ta wstrzykiwana metoda ma działać na rzecz obiektu czy klasy. Najczęściej chodzi Ci o wstrzyknięcie/zastąpienie w kontekście klasy. Możesz wtedy to zrobić tak:
import types
class ConnectionStrategy:
def __init__(self, func=None):
self.name = 'ConnectionStrategy'
if func is not None:
self.connect = types.MethodType(func, self)
def connect(self):
print(self.name + ' unknown')
def connect_database1(self):
print(self.name + ' connect to database 1')
def connect_database2(self):
print(self.name + ' connect to database 2')
if __name__ == '__main__':
strat0 = ConnectionStrategy()
strat1 = ConnectionStrategy(connect_database1)
strat1.name = 'ConnectionStrategy example 1'
strat2 = ConnectionStrategy(connect_database2)
strat2.name = 'ConnectionStrategy example 2'
strat0.connect()
strat1.connect()
strat2.connect()