【问题标题】:How to avoid object creation in python?如何避免在python中创建对象?
【发布时间】:2012-04-29 09:01:52
【问题描述】:

我是 python 编程的新手,我有一个类,我为这个类创建了一个对象(obj1)。我不想创建这个对象以外的对象,如果有任何人想为这个类创建一个更多的对象那应该只引用第一个对象(而不是再创建一个对象)。如何做到这一点?请参考下面的代码?

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

【问题讨论】:

标签: python python-3.x


【解决方案1】:

所以你想要一些单例的东西?然后根本不要为此使用对象。只需将函数放在单独的模块(.py 文件)中,然后将变量放在模块范围内(例如全局变量) - 如果您不需要线程安全,这就是执行所需操作的 Python 方式。请记住:这不是 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?

【讨论】:

  • 同理,虽然讨论了其他问题:Python Is Not Java.
  • @delnan 太棒了。好评
  • 我对使用模块而不是类的 +1。与模块相比,实际上创建类和实例是为了能够创建更多实例。
【解决方案2】:

这里有一个简单的方法——隐藏类名:

class obj:
    pass

obj = obj()

这将使class obj 实例之后更难以创建——但并非不可能,正如 cmets 中所指出的那样。

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

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

【讨论】:

  • obj2 = type(obj)()。实际上,在元编程代码中不时使用这样的代码是有充分理由的(并且没有恶意)。
  • 是的,我在 ORM 代码和 Python 到其他语言的接口中看到过类似的疯狂东西。
【解决方案3】:

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

【讨论】:

  • 这不是解决方案。单例模式意味着如果任何代码(不知道程序的其他部分)创建另一个单例对象,它实际上共享唯一的一个对象,而无需任何其他特殊方式。共享单个对象的协议不会阻止其他代码创建另一个实例。
猜你喜欢
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
相关资源
最近更新 更多