Я читал документацию, описывающую наследование классов, абстрактные базовые классы и даже интерфейсы python. Но ничто не швы, чтобы быть именно тем, чего я хочу. А именно, простой способ создания виртуальных классов. Когда виртуальный класс вызывается, я хотел бы, чтобы он создавал экземпляр некоторого более определенного класса, основываясь на том, какие параметры он задает, и передайте обратно вызывающую функцию. На данный момент у меня есть сводный способ перенаправления вызовов на виртуальный класс до базового класса.Виртуальные классы: делать это правильно?
Идея заключается в следующем:
class Shape:
def __init__(self, description):
if description == "It's flat": self.underlying_class = Line(description)
elif description == "It's spiky": self.underlying_class = Triangle(description)
elif description == "It's big": self.underlying_class = Rectangle(description)
def number_of_edges(self, parameters):
return self.underlying_class(parameters)
class Line:
def __init__(self, description):
self.desc = description
def number_of_edges(self, parameters):
return 1
class Triangle:
def __init__(self, description):
self.desc = description
def number_of_edges(self, parameters):
return 3
class Rectangle:
def __init__(self, description):
self.desc = description
def number_of_edges(self, parameters):
return 4
shape_dont_know_what_it_is = Shape("It's big")
shape_dont_know_what_it_is.number_of_edges(parameters)
Мой перетрассировка далека от оптимальной, так как только звонки на number_of_edges() функция передаются дальше. Добавление чего-то вроде этого в Shape не является швом, чтобы сделать трюк либо:
def __getattr__(self, *args):
return underlying_class.__getattr__(*args)
Что я делаю неправильно? Вся идея плохо реализована? Любая помощь очень ценится.
'__getattr__' работает только для новых классов. Это означает, что ваши классы должны быть подклассами 'object'. –
То, что вы пытаетесь сделать, также называется классом, имеющим виртуальный конструктор (а не «виртуальные классы»).См. Соответствующий вопрос [_Что такое фабрика классов? _] (Http://stackoverflow.com/questions/2526879/what-exactly-is-a-class-factory) – martineau