Я хотел бы хранить сигнатуру сигнатур функций в базовом классе и иметь дочерние классы, переопределяющие некоторые из этих сигнатур функций. Однако, похоже, что моя реализация ломает полиморфизм. Я хочу несколько предложений по элегантной альтернативе. Благодаря!python: Function pointer breaks polymorphism
class Base:
def __init__(self, key):
self.FXN[key](self)
def f(self):
pass
def g(self):
pass
a = 1
FXN = {
1 : f,
2 : g
}
class Child1(Base):
def __init__(self, key):
self.FXN[key](self)
def f(self):
print 'hi'
class Child2(Base):
def __init__(self, key):
self.FXN[key](self)
def f(self):
print 'hey'
def g(self):
print 'hello'
if __name__ == '__main__':
Child1(1) # Nothing happens
Child2(1) # Nothing happens
Child2(2) # Nothing happens
Edit: осветленный проблема
Edit 2: осветленный проблема снова
Комментарий: В более сложном случае, каждый из конструкторов может взять в объект некоторого типа. Ключ - это перечисление, которое идентифицирует тип объекта и диктует, какой путь инициирования экземпляра взять.
Решение от Бруно: Мистер Бруно ниже дал мне относительно элегантное решение.
class Base:
def __init__(self, key):
self.FXN[key](self)
def f(self):
pass
def g(self):
pass
FXN = {
1 : lambda self: self.f(),
2 : lambda self: self.g()
}
class Child1(Base):
def __init__(self, key):
self.FXN[key](self)
def f(self):
print 'hi'
class Child2(Base):
def __init__(self, key):
self.FXN[key](self)
def f(self):
print 'hey'
def g(self):
print 'hello'
if __name__ == '__main__':
Child1(1) # hi
Child2(1) # hey
Child2(2) # hello
Честность, почему бы вы когда-нибудь хотели бы сделать это вместо того, чтобы используя стандартную нотацию языка? Является ли ваша проблема проблемой [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? –
Моя проблема заключается в том, чтобы получить элегантный способ выполнения однопараметрической перегрузки конструктора. Я не поклонник больших блоков if-elif-else – user1836155
И почему вы думаете, что оригинальный метод Python (и тот, что у большинства других OOPL) не изящный? – Olaf