为什么在执行新操作之前实例化 python class 会重复其他实例之前的操作?
Why is instantiating python class repeating former actions by other instances before doing new action?
我已尝试用一个自定义示例尽可能好地说明这个问题。
我设置了一个特殊的 class,它系统地运行了非常多的步骤 from __init__(self)
。
一切似乎都很好,除了这个非常棘手的运行ge 问题,每次我调用 class,它似乎回到过去并重复自己在执行新操作之前执行前两个操作。 如果我 运行 它执行五次,到第五次它会在执行第 5 个新操作之前重复前 4 个相同的操作,依此类推。
这是一个非常难运行的问题。这是在 django 环境中的 python 交互。希望我的代码示例很好地说明了这个问题:
#file helper_stuff.py
class one_shot_long_process():
obj=''
obj2=''
def init(self, obj, obj2):
self.obj=obj
self.obj2=obj2
self.complex_action()
self.complex_action_2()
def complex_action(self):
'''do lots of things in a row with obj'''
def complex_action_2(self):
'''
Do more stuff, make decisions, loop, etc
with obj 1, 2
make entries, do writes
>>>> WRITE FILES by number (jpegs)
'''
所以你有一个基本的例子class。它获取 Django 模型、处理图像并写入它们。我已经非常仔细地检查过,我认为没有理由以这种方式重复(特别是因为我直接调用 class-instancing,如下所示)
#file interactive_stuff.py
#!/home/leo/.virtualenvs/illo/bin/python3 -i
from helper_stuff import one_shot_long_process
>>> one_shot_long_process(obj, obj2)
#WRITES FILE 1.jpg
>>> one_shot_long_process(obj, obj2)
#re-WRITES FILE 1.jpg
#WRITES FILE 2.jpg
>>> one_shot_long_process(obj, obj2)
#re-WRITES FILE 1.jpg
#re-WRITES FILE 2.jpg
#WRITES FILE 3.jpg
这非常难运行ge -- 为什么重新调用 one_shot_long_process(obj, obj2) 仍然导致之前的 "instances" 重复它们自己?我该如何解决这个问题?
没有一些实际代码我只能猜测,但我会试一试。
您没有开始 "afresh",因为 one_shot_long_process.obj
和 one_shot_long_process.obj2
是 class variables, not instance variables.
让我举个例子。
class Foo():
l = []
def __init__(self, x):
self.l.append(x)
print self.l
class Bar():
def __init__(self, x):
self.l = []
self.l.append(x)
print self.l
Foo(4) # prints [4]
Foo(4) # prints [4, 4]
Bar(4) # prints [4]
Bar(4) # prints [4]
正如其他人所说,没有一些实际代码,这是不可能的。在您发布的代码中,它没有任何区别。
附带说明一下,common naming convention for classes 是使用 CapWords
,即在您的情况下 OneShotLongProcess
。
我已尝试用一个自定义示例尽可能好地说明这个问题。
我设置了一个特殊的 class,它系统地运行了非常多的步骤 from __init__(self)
。
一切似乎都很好,除了这个非常棘手的运行ge 问题,每次我调用 class,它似乎回到过去并重复自己在执行新操作之前执行前两个操作。 如果我 运行 它执行五次,到第五次它会在执行第 5 个新操作之前重复前 4 个相同的操作,依此类推。
这是一个非常难运行的问题。这是在 django 环境中的 python 交互。希望我的代码示例很好地说明了这个问题:
#file helper_stuff.py
class one_shot_long_process():
obj=''
obj2=''
def init(self, obj, obj2):
self.obj=obj
self.obj2=obj2
self.complex_action()
self.complex_action_2()
def complex_action(self):
'''do lots of things in a row with obj'''
def complex_action_2(self):
'''
Do more stuff, make decisions, loop, etc
with obj 1, 2
make entries, do writes
>>>> WRITE FILES by number (jpegs)
'''
所以你有一个基本的例子class。它获取 Django 模型、处理图像并写入它们。我已经非常仔细地检查过,我认为没有理由以这种方式重复(特别是因为我直接调用 class-instancing,如下所示)
#file interactive_stuff.py
#!/home/leo/.virtualenvs/illo/bin/python3 -i
from helper_stuff import one_shot_long_process
>>> one_shot_long_process(obj, obj2)
#WRITES FILE 1.jpg
>>> one_shot_long_process(obj, obj2)
#re-WRITES FILE 1.jpg
#WRITES FILE 2.jpg
>>> one_shot_long_process(obj, obj2)
#re-WRITES FILE 1.jpg
#re-WRITES FILE 2.jpg
#WRITES FILE 3.jpg
这非常难运行ge -- 为什么重新调用 one_shot_long_process(obj, obj2) 仍然导致之前的 "instances" 重复它们自己?我该如何解决这个问题?
没有一些实际代码我只能猜测,但我会试一试。
您没有开始 "afresh",因为 one_shot_long_process.obj
和 one_shot_long_process.obj2
是 class variables, not instance variables.
让我举个例子。
class Foo():
l = []
def __init__(self, x):
self.l.append(x)
print self.l
class Bar():
def __init__(self, x):
self.l = []
self.l.append(x)
print self.l
Foo(4) # prints [4]
Foo(4) # prints [4, 4]
Bar(4) # prints [4]
Bar(4) # prints [4]
正如其他人所说,没有一些实际代码,这是不可能的。在您发布的代码中,它没有任何区别。
附带说明一下,common naming convention for classes 是使用 CapWords
,即在您的情况下 OneShotLongProcess
。