使用python限制类实例的数量

2024-10-03 21:26:17 发布

您现在位置:Python中文网/ 问答频道 /正文

Μy主类创建一个简单的QmainWindows,如下所示:

class mcManageUiC(QtGui.QMainWindow):
    def __init__(self):
        super(mcManageUiC, self).__init__()

        self.initUI()

    def initUI(self):
        self.show()

在我的文件末尾,我这样启动它:

^{pr2}$

我的问题是,每次我找到它,它都会启动一个新窗口。 我想知道是否有一种方法可以检测脚本中是否存在以前的类实例(以便关闭旧的类实例或避免启动新的类实例),或者其他任何解决方案?在

另外,在用py2exe编译代码时,Windows上的.exe文件也有同样的问题;它每次都会启动一个新窗口。我能在里面加些什么吗设置.py让Windows不这么做?在

有没有可能,如果是,那怎么办?在

注意:我使用的是Windows7 64位编译eclipse。在


Tags: 文件实例selfinitwindowsdefshowclass
3条回答

只需添加一个计数器,就可以限制要在代码中创建的实例数:

class A(object):
 ins = 0 # This is a static counter
 def __init__(self):
  if A.ins >= 1: # Check if the number of instances present are more than one. 
   del self
   print "Failed to create another instance" #if > 1, del self and return.
   return
  A.ins += 1
  print "Success",str(self)

尝试通过以下方式运行:

^{pr2}$

你可以独占一个插座

import socket
try:    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except:
    "Network Error!"

s.settimeout(30)
try:
    s.connect(('localhost' , 123))
except:
    "could not open...already in use socket(program already running?)"

不知道这是不是一个好的方法,但我过去用过它,它解决了这个问题

这是为了防止启动一个程序时,它已经在运行,而不是从一个脚本启动一个新的窗口,这是产生几个窗口。。。在

有几种方法可以做到这一点,您可以使用一个Class属性来存储所有实例——如果您这样做,您可能希望通过weakref模块将它们存储为弱引用,以防止垃圾收集出现问题:

class MyClass(object):
    _instances=[]
    def __init__(self):
        if(len(self._instances) > 2):
            self._instances.pop(0).kill() #kill the oldest instance
        self._instances.append(self)

    def kill(self):
        pass #Do something to kill the instance

这有点难看。您可能还想考虑使用某种工厂(有条件地)创建一个新实例。这个方法比较一般。在

^{pr2}$

相关问题 更多 >