Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 1, 2015 09:34:07

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

указание суперкласса object

помогите пожалуйста разобраться

я создаю синглтон так:

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 но если его не указывать, то он не перестанет быть наследником настолько фундаментального класса. тем не менее это произошло в моих примерах

Офлайн

#2 Дек. 1, 2015 09:41:01

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

указание суперкласса object

zlodiak
но если его не указывать, то он не перестанет быть наследником настолько фундаментального класса.
Все не так. Во втором питоне есть классы нового и старого стиля. Гуглить самостоятельно.



Офлайн

#3 Дек. 3, 2015 00:08:19

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

указание суперкласса object

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version