2012-04-29 2 views
4

Я новичок в программировании на python, у меня есть один класс, для этого класса я создал один объект (obj1) .i не хочу создавать кроме этого объекта, если какое-либо тело хочет создать еще один объект для этого класса, должен ссылаться только на первый объект (вместо создания еще одного объекта). Как это сделать? пожалуйста, обратитесь к приведенному ниже коду?Как избежать создания объектов в python?

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 
+1

Проверьте этот ответ http://stackoverflow.com/questions/6760685/creating-a-singleton -in-python on singleton в python –

+0

Возможный дубликат [Есть простой, элегантный способ определения Singletons в Python?] (http://stackoverflow.com/questions/31875/is-there-a-simple-elegant- way-to-define-singletons-in-python) –

+2

Отключить тему, но в комментариях Python начинается с h символ (#). – martineau

ответ

7

Так что вы хотите что-то синглтон-иш? Тогда не используйте объекты для этого вообще. Просто поставьте функции в отдельный модуль (.py-файл) и поместите переменные в область модуля (например, глобальные переменные) - это питонический способ делать то, что вы хотите, если вам не нужна безопасность потоков. Помните: это не 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 Pattern и Is there a simple, elegant way to define singletons?

+4

В том же духе, хотя и обсуждает другие проблемы: [Python Is Is Java] (http://dirtsimple.org/2004/12/python-is -на-java.html). – delnan

+1

@ delnan, что было потрясающе. Хороший комментарий –

+0

My +1 к использованию модуля вместо класса. Классы и экземпляры были фактически созданы, чтобы иметь возможность создавать больше экземпляров по сравнению с модулями. – pepr

1

Вы можете создать один объект и сделать его глобальным т.е. объект верхнего уровня в модуле, используя его, если все, что вы кодируете, будет идти в одном файле, или вы можете поместить его в отдельный модуль и импортировать его.

+0

Это не решение. Шаблон singleton означает, что если какой-либо код (который не знает других частей программы) * создает еще один одноэлементный объект, он фактически разделяет единственный без каких-либо других специальных средств. Соглашение о совместном использовании одного объекта не мешает другому коду создавать другой экземпляр. – pepr

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 
+3

'obj2 = type (obj)()'. На самом деле такой код используется время от времени по уважительным причинам (и без злого умысла), в метапрограммировании кода. – delnan

+0

Да, я видел такие сумасшедшие вещи, как в коде ORM и интерфейсах Python-to-other-language. –

Смежные вопросы