如何避免在python中创建对象?

时间:2012-04-29 09:01:53

标签: python python-3.x

我是python编程的新手,我有一个类,对于这个类,我创建了一个对象(obj1).i不想创建除此对象之外的其他对象,如果有任何体想要为这个类创建另一个对象应该只引用第一个对象(而不是再创建一个对象)。如何做到这一点?请参考以下代码?

class MyClass:
   def __init__(self):
      pass
obj1=MyClass()//create object
obj2=MyClass()//avoid creation and refer obj2 to obj1
obj3=MyClass()//avoid creation and refer obj3 to obj1

3 个答案:

答案 0 :(得分:7)

所以你想要一些单身人士的东西?然后根本不要使用对象。简单地将函数放在一个单独的模块(.py文件)中,并将变量放在模块范围内(例如全局变量) - 如果你不需要线程安全,这就是你想做的事情的pythonic方法。请记住:这不是java,并且使用类来处理所有事情并非如此。

但是,这里有一些代码只允许一个实例:

class MyClass:
    def __init__(self):
        if getattr(self.__class__, '_has_instance', False):
            raise RuntimeError('Cannot create another instance')
        self.__class__._has_instance = True

如果您想要单身,请查看Python and the Singleton PatternIs there a simple, elegant way to define singletons?

答案 1 :(得分:3)

这是一个简单的方法 - 隐藏班级名称:

class obj:
    pass

obj = obj()

这将使class obj个实例更难以创建 - 但并非不可能,正如评论中所指出的那样。

另一种选择,在第一次使用后删除该类:

class MyClass:
    def method(self): print 'spam'

obj1 = MyClass()
del MyClass
obj1.method()  # show instance still exists
obj2 = MyClass()

输出:

spam
Traceback (most recent call last):
  File "noclass.py", line 7, in <module>
    obj2 = MyClass()
NameError: name 'MyClass' is not defined

答案 2 :(得分:1)

您可以创建单个对象并使其成为模块中的全局即顶级对象,如果您编写的所有内容都放在单个文件中,或者您可以将其放在单独的模块中并导入它。