7

我是 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
4

3 回答 3

8

所以你想要一些单身的东西?然后根本不要为此使用对象。只需将函数放在单独的模块(.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 和单例模式以及是否有一种简单、优雅的方式来定义单例?

于 2012-04-29T09:03:30.643 回答
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
于 2012-04-29T10:46:10.160 回答
1

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

于 2012-04-29T09:05:50.353 回答