__new__() does not return anything, on singletong pattern
Mario Figueiredo
marfig at gmail.com
Thu Mar 12 04:00:37 EDT 2015
On Thu, 12 Mar 2015 16:31:12 +1100, Steven D'Aprano
<steve+comp.lang.python at pearwood.info> wrote:
>Mario Figueiredo wrote:
>
>
>If this is supposed to be a singleton, you can't create more instances. The
>point of a singleton that there is only one instance (or perhaps a small
>number, two or three say). Why do you need two different ways to create
>instances if you only have one instance?
>
The map is instantiated from the contents of a saved map file on the
main application.
A different application, a map editor, needs to also instantiate an
object of the class Map. But in this case the map needs to either be
empty (if the user wants to create a new map), or loaded from the
saved map file (if the user wants to edit an existing map).
>
>> I added the following method to the class definition, above:
>>
>> @classmethod
>> def generate(cls, width, height, fill=terrain[6]):
>> if Map._instance is None:
>> Map._instance = super(Map, cls).__new__(cls)
>> else:
>> raise Exception('Cannot generate an instance of Map.')
>>
>> Map._instance.author = None
>> Map._instance.name = None
>
>Since this method modifies the singleton instance in place, it doesn't
>generate a new instance. It shouldn't be called generate().
No sure what you mean. That method either creates a new instance or
raises an exception. It doesn't modify an instance in-place.
>
>> Map._instance.description = None
>> # etc...
>> self.cells = [Cell(fill)] * width * height
>> return Map._instance
>
>That's not your actual code, since the indentation is wrong.
Map._instance.description = None
# etc...
self.cells = [Cell(fill)] * width * height
return Map._instance
More information about the Python-list
mailing list