【发布时间】:2020-03-05 20:45:23
【问题描述】:
我有几个类,我将它们视为我的数据的容器(图形表示)。他们都有相同的@staticmethods 例如get_edges(),get_vertices()。我想通过给定的参数导入指定的图形类。我现在要做的是:
class Figure:
def __init__(self, figure_type):
exec('import figures.' + figure_type.lower())
self.element = eval('figures.' + figure_type.lower() + '.' + figure_type)()
def create(self, vertices):
glBegin(GL_LINES)
for edge in self.element.get_edges():
for vertex in edge:
glColor3fv((0.5,0,0))
glVertex3fv(vertices[vertex])
glEnd()
class Cube:
@staticmethod
def get_edges():
return ((0, 1),(0, 3),(0, 4),(2, 1),(2, 3),(2, 7),(6, 3),(6, 4),(6, 7),(5, 1),(5, 4),(5, 7))
我想知道是否有办法得到类似的东西:
class Figure(figure_type):
def __init__(self, figure_type):
为了能够使用例如self.get_edges() 而不是 self.element.get_edges()。我怎么才能得到它?有没有可能?
【问题讨论】:
-
在 OOP 中,您将使用工厂模式来创建对象:python-3-patterns-idioms-test.readthedocs.io/en/latest/…
-
为什么选择这个方案?
Figure是否具有所有figure_type共有的方法,并且每个figure_type具有特定的边和顶点方法?出于某种原因,对象是否需要是Figure实例? -
@wwii 是的,
Figure包含应用于每个figure_type的方法。figure_type仅包含返回带有边、顶点或曲面的sets 的方法,以便在Figure类中的OpenGL中绘制它们。我为什么选择它?好吧,它似乎对我来说具有很好的可读性,也许将来我可以为每个图形添加一些特定的方法,但老实说我是初学者,所以我可能会做更好的设计。目前我尝试在答案中遵循给定的链接,但这些概念在我看来有点高级。 -
@Ethr,摆脱
exec并改用importlib。正如 hspandher 所说,使用工厂模式可能比元类更容易(但元类更复杂,玩起来更有趣)。 -
更好的设计是将所有图形类型简单地放在一个 single 模块中。定义单独的模块,如
figure.cube和figure.whatever可以做任何有用的事情,并且会使你想要做的事情变得复杂。
标签: python class inheritance