【发布时间】:2022-01-22 10:10:49
【问题描述】:
我主要使用 C、C++ 进行编程,最近将一个项目转换为 python。除非我无法轻松地转换多处理。
在示例中,我有一个填充了一个球类的数组,该类具有一个名为 update 的成员函数,其中传入了 3 个变量。
就是这样。它存储在一个称为球的数组中。 我已经浏览了足够多的帖子文档和视频,但没有找到任何涵盖这几个方面的内容,但没有展示如何处理传入的变量。
理想情况下,我会创建一个流程拉动,让它在它们之间拆分工作。 我需要检索对象并更新原始进程空间中的对象。
不确定,但看起来可能更容易强制它输出一个元组,然后使用所有数据更新类,然后编写另一个函数来更新类。
我们非常感谢您反馈在 python 中执行此操作的最佳方法。我也欣赏性能胜过做某事的容易程度。毕竟,这就是这样做的意义所在。 提前致谢。
class Ball:
def __init__(self,x,y,vx,vy,c):
self.x=x
self.y=y
self.vx=vx
self.vy=vy
self.color=c
return
@classmethod
def update(self,w,h,t):
time = float(t)/float(1000000)
#print(time)
xp = float(self.vx)*float(time)
yp= float(self.vy)*float(time)
self.x += xp
self.y += yp
#print (str(xp) +"," +str(yp))
if self.x<32:
self.vx = 0 - self.vx
self.x += (32-self.x)
if self.y<32:
self.vy = 0 - self.vy
self.y += (32-self.y)
if self.x+32>w:
self.vx = 0 - self.vx
self.x -= (self.x+32)-w
if self.y+32>h:
self.vy = 0 - self.vy
self.y -= (self.y+32)-h
return
类通过以下方法更新
def play_u(self):
t = self.gt.elapsed_time()
self.gt.set_timer()
for i in self.balls:
i.update(self.width,self.height,t)
return
【问题讨论】:
-
顺便说一句:与 C++ 一样,Python 支持类属性和实例属性,目前尚不清楚您对类
Ball的意图是什么。例如,您的vx属性被定义为类属性,并且在您的方法中,您根据这些是类方法的约定命名第一个参数cls,但这些方法没有用@classmethod修饰,所以它们实际上是实例方法。因此,在方法@987654329@ 中,当您为cls.vx赋值时,您不会 更新类属性。去掉类属性,将cls重命名为self。 -
但是如果你真的打算把所有东西都变成类属性并且你的方法要更新这些类属性,那么你必须用
@classmethod装饰你的方法。但是,如果您要处理这些数组,那将没有意义,不是吗? -
多处理仅在将参数从一个地址空间传递到另一个地址空间时就会产生大量开销。为了让它变得有价值,
update完成的处理必须需要足够的 CPU 资源,以便通过并行性获得的节省抵消所产生的额外开销。我不确定这里会是这样。如果您更新问题以显示您实际上是如何多次调用update将有所帮助,即发布接近minimal, reproducible example 的内容。 -
我会根据您的建议进行样式更改。谢谢那部分。抱歉,刚刚习惯了python。搜索@classmethod。我不得不在另一个网站上找到它。这是我在 PEP8 文档中发现的典型内容。这是完整的项目。 github.com/Diconica/game_Engine 这是一个从 C++ 转换而来的游戏引擎 类对象数组是 OOP 编程的标准。你是想说python不能做OOP吗?这在所有其他 OOP 语言中都很正常,C++、C#、JAVA...
-
顺便说一句,谢谢。坦率地说,到目前为止,我还不知道有两种不同的变量类型,例如类和实例。在其他语言中,变量在类中声明为它的成员。此处将其描述为共享变量的方式使其几乎像一个单例。
标签: python class multiprocessing member-functions