为什么在执行新操作之前,实例化python类会重复其他实例以前的操作



我已经尝试用一个自定义示例尽可能好地表示这个问题。

我设置了一个特殊的课程,系统地通过from __init__(self)向前的大量步骤。

一切似乎都很好,除了这个非常奇怪的问题,每次我调用类,它似乎回到过去,并在做新动作之前重复自己的前两个动作。如果我运行它五次,到第五次时,它将在执行第五次新操作之前重复前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)
        '''

这就是这个类的一个基本例子。它获取django模型,处理图像,并写入它们。我已经相当仔细地检查过了,我认为没有理由以这种方式重复它(特别是因为我直接调用了类实例化,如下所示)

#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

这很奇怪——为什么重新调用one_shot_long_process(obj, obj2)仍然会导致以前的"实例"重复自己?我怎么才能避开这个问题呢?

如果没有实际的代码,我只能猜测,但我会试一试。

您没有"重新"开始,因为one_shot_long_process.objone_shot_long_process.obj2是类变量,而不是实例变量。

让我举个例子来说明。

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]

正如其他人所说,如果没有实际的代码,就无法判断。在你发布的代码中,它没有什么区别。

顺便说一句,类的通用命名约定是使用CapWords,即在您的情况下使用OneShotLongProcess

最新更新