Python 了解所有基类';s实现 问题:
我正在尝试用python为Blender 3D创建一个插件来模拟boids粒子系统,这个插件非常复杂,将从头开始 这是我第三次尝试为它设计可维护的代码结构 我试图提出一种pythonic设计,允许快速原型化不同种类的粒子相互作用,这样我就可以创建一个新的粒子实现,并让它与系统中的其他粒子相互作用 请参见示例:Python 了解所有基类';s实现 问题:,python,design-patterns,Python,Design Patterns,我正在尝试用python为Blender 3D创建一个插件来模拟boids粒子系统,这个插件非常复杂,将从头开始 这是我第三次尝试为它设计可维护的代码结构 我试图提出一种pythonic设计,允许快速原型化不同种类的粒子相互作用,这样我就可以创建一个新的粒子实现,并让它与系统中的其他粒子相互作用 请参见示例: class ParticleSystem: def __init__(self): self.particles = [] def add_par
class ParticleSystem:
def __init__(self):
self.particles = []
def add_particle(self, particle):
self.particles.append(particle)
def step_frame(self, speed):
for p in self.particles:
p.step(speed)
class Particle:
def __init__(self, system)
self.location = Vector(0,0,0)
self.system = system
def step(speed):
for particle in self.system.particles:
#random interatcion formula
self.location = particle.location + self.location
system = ParticleSystem()
p = Particle(system)
system.add_particle(p)
正如你所看到的,这是我最好的解释,但当我有多类粒子,我必须把系统传递给粒子,然后再把粒子传递给系统时,它会变得非常混乱
问题
有没有一种方法可以让我检测类实现的创建时间,比如:
class barball(Particle):
,让系统类知道所有现有类型,这样我就可以调用system.create\u barball(location)?最简单的方法可能是使用粒子的子类方法
您可以这样定义ParticleSystem
:
class ParticleSystem(object):
def __init__(self):
self.particles = []
def create_particle(self, particle_type, location):
if particle_type in (cls.__name__ for cls in Particle.__subclasses__()):
p = eval(particle_type)(self)
p.location = location
self.particles.append(p)
else:
raise TypeError("{} is not a subclass of Particle".format(particle_type))
也就是说,避免让不同的类了解彼此的内部工作原理通常是一个好主意。ParticleSystem
真的需要知道Particle
的所有子类吗(更好的是,每个粒子都需要知道它所在的系统吗?)?还是只需要一种简单的方法来实例化新的粒子
对象?如果你只是需要后者,你可以用一个
注意:使用eval
通常有点鲁莽,但因为它受到粒子中的保护。uu子类uu()
条件的保护,我们应该没问题。我可以想出至少三种合理且相当不相关的方法,因此投票结束的范围太广。1) 在init上施加接口,并将子类传递给注册方法。2) 使用子类钩子。3) 如果需要的话,只需要每个粒子注册器本身。3现在看起来是最好的。谢谢,\uuuuuu subclass\uuuu
属性正是我想要的,在这种情况下,粒子将处理力,相互吸引和消除,因此,粒子了解其系统非常重要。