я создаю синглтон так:
class Room(object): obj = None def __new__(cls,*dt,**mp): if cls.obj is None: cls.obj = object.__new__(cls,*dt,**mp) return cls.obj def __init__(self, left_wall, right_wall, front_wall, back_wall): self.left_wall = left_wall self.right_wall = right_wall self.front_wall = front_wall self.back_wall = back_wall def __str__(self): return str(self.left_wall) + str(self.right_wall) + str(self.front_wall) + str(self.back_wall) room_obj = Room(True, True, True, True) room_obj2 = Room(False, False, False, False) print(room_obj is room_obj2) print(room_obj) print(room_obj2)
всё ок, консоль выводит следующее:
kalinin@kalinin ~/python/object2 $ python index.py True FalseFalseFalseFalse FalseFalseFalseFalse
но такой код:
class Room(): obj = None def __new__(cls,*dt,**mp): if cls.obj is None: cls.obj = object.__new__(cls,*dt,**mp) return cls.obj def __init__(self, left_wall, right_wall, front_wall, back_wall): self.left_wall = left_wall self.right_wall = right_wall self.front_wall = front_wall self.back_wall = back_wall def __str__(self): return str(self.left_wall) + str(self.right_wall) + str(self.front_wall) + str(self.back_wall) room_obj = Room(True, True, True, True) room_obj2 = Room(False, False, False, False) print(room_obj is room_obj2) print(room_obj) print(room_obj2)
выводит следующее:
kalinin@kalinin ~/python/object2 $ python index.py False TrueTrueTrueTrue FalseFalseFalseFalse
то есть получается, что синглтон не работает.
а разница лишь а том, что во втором случае я не указываю для класса суперкласс. то есть, как я понимаю, любой класс наследуется от самого общего класса object но если его не указывать, то он не перестанет быть наследником настолько фундаментального класса. тем не менее это произошло в моих примерах