我正在尝试用python为blender3d创建一个插件来模拟boids粒子系统,这个插件非常复杂,将从头开始。你知道吗
这是我第三次尝试为它设计可维护的代码结构。你知道吗
我试着提出pythonic设计,允许快速原型化不同种类的粒子相互作用,这样我就可以创建一个新的粒子实现,并让它与系统中的其他粒子相互作用。你知道吗
参见示例:
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 Baseball(Particle):
,让系统类知道所有现有的类型,这样我就可以调用system.create_baseball(location)
?你知道吗
最简单的方法可能是使用
Particle
的__subclasses__
方法。你知道吗你可以这样定义
ParticleSystem
:也就是说,避免让不同的类知道彼此的内部工作原理通常是个好主意。
ParticleSystem
真的需要知道Particle
的所有子类吗(更好的是,每个粒子都需要知道它所在的系统吗?)?还是只需要一种简单的方法来实例化新的Particle
对象?如果您只是需要后者,您可以使用simple factory method。你知道吗注意:使用
eval
通常有点鲁莽,但是因为它受到in Particle.__subclasses__()
条件的保护,所以应该可以。你知道吗相关问题 更多 >
编程相关推荐