Дополнительно
Класс Python, возвращающий значение
Я'пытаюсь создать класс, который возвращает значение, а не self.
Я покажу вам пример, сравнивая со списком:
>>> l = list()
>>> print(l)
[]
>>> class MyClass:
>>> pass
>>> mc = MyClass()
>>> print mc
<__main__.MyClass instance at 0x02892508>
Мне нужно, чтобы MyClass возвращал список, как это делает list()
, а не информацию об экземпляре. Я знаю, что могу создать подкласс list. Но есть ли способ сделать это без создания подкласса?
Я хочу имитировать список (или другие объекты):
>>> l1 = list()
>>> l2 = list()
>>> l1
[]
>>> l2
[]
>>> l1 == l2
True
>>> class MyClass():
def __repr__(self):
return '[]'
>>> m1 = MyClass()
>>> m2 = MyClass()
>>> m1
[]
>>> m2
[]
>>> m1 == m2
False
Почему m1 == m2
ложно? Вот в чем вопрос.
Извините, если я не отвечаю всем вам. Я пробую все решения, которые вы мне предлагаете. Я не могу использовать def
, потому что мне нужно использовать такие функции, как setitem, getitem и т.д.
13
3
Я думаю, что вы очень запутались в происходящем.
В Python все является объектом:
[]
(список) - это объект.'abcde'
(строка) - объект1
(целое число) - это объектMyClass()
(экземпляр) - объектMyClass
(класс) также является объектомсписок
(тип - подобно классу) также является объектомВсе они являются "значениями" в том смысле, что они представляют собой вещь, а не имя, которое ссылается на вещь. (Переменные - это имена, которые ссылаются на значения.) Значение не отличается от объекта в Python.
Когда вы вызываете объект класса (например,
MyClass()
илиlist()
), он возвращает экземпляр этого класса. (На самом делеlist
- это тип, а не класс, но здесь я немного упрощаю).Когда вы печатаете объект (т.е. получаете строковое представление объекта), вызывается магический метод
__str__
или__repr__
и печатается возвращаемое значение.Например:
Поэтому то, о чем вы просите, "Мне нужно, чтобы MyClass возвращал список, как list(), а не информацию об экземпляре," не имеет никакого смысла.
list()
возвращает экземпляр списка.MyClass()
возвращает экземпляр MyClass. Если вам нужен экземпляр списка, просто получите экземпляр списка. Если вместо этого вопрос заключается в том, как выглядят эти объекты, когда выпечатаете
их или смотрите на них в консоли, то создайте метод__str__
и__repr__
, который представляет их так, как вы хотите, чтобы они были представлены.Обновление для нового вопроса о равенстве
Еще раз,
__str__
и__repr__
предназначены только для печати, и не влияют на объект никаким другим образом. Если два объекта имеют одинаковое значение__repr__
, это не значит, что они равны!MyClass() != MyClass()
, потому что ваш класс не определяет, как они могут быть равны, поэтому он возвращается к поведению по умолчанию (типаobject
), которое заключается в том, что объекты равны только самим себе:Если вы хотите изменить это, используйте один из магических методов сравнения
Например, вы можете иметь объект, который равен всему:
Я думаю, вы должны сделать две вещи:
Посмотрите на это руководство по использованию магического метода в Python.
Обоснуйте, почему вы не подклассифицируете
list
, если то, что вам нужно, очень похоже на список. Если подкласс не подходит, вы можете делегировать экземпляр обернутого списка:Теперь список будет вести себя как список, не будучи списком (т.е. без подкласса
list
).Если вам нужен способ превратить ваш класс в подобие списка без подкласса
list
, то просто сделайте метод, возвращающий список:Если вы хотели, чтобы
print MyClass()
выводил список, просто переопределите__repr__
:EDIT: Я вижу, вы имели в виду, как сделать объекты сравниваемыми. Для этого вы переопределяете метод
__cmp__
.Вы описываете функцию, а не класс.