Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 了解所有基类';s实现 问题:_Python_Design Patterns - Fatal编程技术网

Python 了解所有基类';s实现 问题:

Python 了解所有基类';s实现 问题:,python,design-patterns,Python,Design Patterns,我正在尝试用python为Blender 3D创建一个插件来模拟boids粒子系统,这个插件非常复杂,将从头开始 这是我第三次尝试为它设计可维护的代码结构 我试图提出一种pythonic设计,允许快速原型化不同种类的粒子相互作用,这样我就可以创建一个新的粒子实现,并让它与系统中的其他粒子相互作用 请参见示例: class ParticleSystem: def __init__(self): self.particles = [] def add_par

我正在尝试用python为Blender 3D创建一个插件来模拟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 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
属性正是我想要的,在这种情况下,粒子将处理力,相互吸引和消除,因此,粒子了解其系统非常重要。