2016-11-07 53 views
2

如何检查一个对象是否已经在python中初始化?我有my_tac = tac(EDL_port)在多个地方,如果它已经被初始化,它会抛出一个如下所示的错误..我想添加一个检查,如果my_tac是initiliazed或没有,如何要做到这一点? CODE: -如何检查一个对象是否已在python中初始化?

#From another file 
my_tac = tac(EDL_port) 

#alpha.py 
class tac: 
    ## tac class constructor. 
    # 
    # @param self 
    # @param timeout 
    # @param baud_rate 
    def __init__(self, port=None, timeout=0.3, baud_rate=115200): 
     if port is not None: 
     self.port = port 
     self.ser = serial.Serial(self.port, baud_rate, timeout=timeout) 
     return 
     else: 
     (tac_ports,spider_ports) = tac_probe_for_devices() 
     print "TAC ports..." 
    ...................... 

错误: -

11/5/2016 8:54:05 PM: my_tac = tac(EDL_port) 
11/5/2016 8:54:05 PM: File "C:\CST_QSPR\third_party_bin\BuildLoaderScripts\Android\android_dl\alpaca.py", line 90, in __init__ 
11/5/2016 8:54:05 PM: self.ser = serial.Serial(self.port, baud_rate, timeout=timeout) 
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 31, in __init__ 
11/5/2016 8:54:05 PM: ERROR:adb -s C2687475 remount failed 
11/5/2016 8:54:05 PM: super(Serial, self).__init__(*args, **kwargs) 
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialutil.py", line 236, in __init__ 
11/5/2016 8:54:05 PM: self.open() 
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 62, in open 
11/5/2016 8:54:05 PM: raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError())) 
11/5/2016 8:54:05 PM: serial.serialutil.SerialException: could not open port 'COM8': WindowsError(5, 'Access is denied.') 
+0

你是什么意思的“初始化”?那'__init __()'运行?对于每个对象实例都是如此。这个错误信息又是如何与问题相关的? –

+0

克劳斯 - 问题是我怎么知道是否有一个my_tac对象实例已经....错误是相关的,因为my_tac的每个对象初始化都拥有一个COM端口,在这种情况下说COM8 ...下一次我初始化它抛出一个错误'访问被拒绝....' – charlieW

回答

1

你看这里什么叫Singleton设计模式。这种方法的关键思想是一个对象只能被实例化一次。第二次尝试实例化它时,您将获得相同的对象。在你的情况下访问数据库或创建端口句柄很方便。在python中没有真正的方法来创建一个单独的类。但是,您可以将您的课程转换为模块tac.py。 python中的模块默认为单例。对于初始化,您可以定义init(port=None, timeout=0.3, baud_rate=115200)函数,它将采用任何必需的参数。

# tac.py 

port = None 

def init(myport=None, timeout=0.3, baud_rate=115200): 
    if myport is not None: 
     global port 
     port = myport 
     ser = serial.Serial(port, baud_rate, timeout=timeout) 
     return 
    else: 
     tac_ports, spider_ports = tac_probe_for_devices() 
     print "TAC ports..." 

def tac_probe_for_devices(): 
    # Probe some devices 
    pass 

import tac 
tac.init(8080) 

# From another file 
import tac 
print 'Tac port: ', tac.port # Print 8080 

请检查this后的更多实施细节。

+0

Kiko - 我需要从另一个文件(如下面的my_tac = tac(EDL_port))传递端口,在这种情况下它将如何变化,在您展示的示例中初始化它tac.py – charlieW

+0

'import tac' 'tac.init(8080)' – kiko

+0

您可以使用'import tac; tac.init(8080)'来自另一个文件。当你从第三个文件中导入tac时,它会返回同一个实例。 – kiko

0

有多种方法可以解决这个问题。但是,我相信Singleton design pattern是解决这个问题最优雅的方法。

有关信息。关于如何实现Singleton设计模式,请参阅以下

Creating a singleton in Python

0

OP自找的,OP接收它。 这是一个单例模式的例子,分解成只有一个类。

class Test : 
    count = 0 
    def __init__(self, value) : 
     if self.__class__.count > 0 : 
      raise Exception 
     else : 
      self.__class__.count += 1 
      self.value = value   #for the sake of the example 


t1 = Test(12)  #instantiates the object 
t2 = Test(27)  #throws an error 

用Python测试3.4.3。

0

这是如何设置一个单例类并将其传递给它的。只需从SingletonClass继承你的tac类。这里的一个窍门是要确保你不要拨打__init__两次。看看我如何检查super(self.__class__, self).__init__()的回报以确保它没有发生。

# tac.py 

class SingletonClass(object): 

    _inst = None 
    _init_called = False 

    def __new__(typ, *args, **kwargs): 

     if SingletonClass._inst is None: 
      obj = object.__new__(typ, *args, **kwargs) 
      SingletonClass._inst = obj 

     return SingletonClass._inst 

    def __init__(self): 

     # Call init inly on first instantiation if this class 
     if SingletonClass._init_called: 
      return True 
     SingletonClass._init_called = True 

class MyClass(SingletonClass): 

    def __init__(self, port): 

     if super(self.__class__, self).__init__(): 
      return 

     self._port = port 
     self._connections = '[D] Connection on port: %s' % self._port 

    def connection(self): 
     return self._connections 

# From another file 
from tac import MyClass 

con = MyClass(8080) 
print 'First connection id: ', id(con) 
print con.connection() 

con = MyClass(5000) 
print 'Second connection id: ', id(con) 
print con.connection() 
相关问题