Как вернуть экземпляр класса в функции в Python
На этой неделе у меня был вызов класса, и хотя я вернул правильный возраст, я не вернул экземпляр класса в соответствии с инструкциями. Я прочитал этот пост , но синтаксис Python 2.7 кажется совершенно другим.
Класс реализован правильно, и вы правильно создаете его экземпляры. Но когда вы пытаетесь найти самую старую собаку, вы возвращаете только ее возраст, а не фактический экземпляр (согласно инструкциям). Экземпляр хранит информацию не только о возрасте, но и о имени. Небольшой комментарий: вы вызываете функцию «old_dog» из отформатированной строки — это нетрадиционно, вам лучше выполнить функцию в строке перед этим и включить только вычисленную переменную внутри отформатированной строки.
Возвращаемое значение класса Python
Я пытаюсь создать класс, который возвращает значение, а не самостоятельно.
я покажу вам пример сравнения со списком:
мне нужно, чтобы MyClass возвращал список, например list() делает, а не информация об экземпляре. Я знаю, что могу составить подкласс списка. Но есть ли способ сделать это без подклассов?
Я хочу имитировать список (или другие объекты):
почему m1 == m2 ложь? Это вопрос.
извините если я не отвечу всем вам. Я пробую все решения, которые ты мне даешь. Я не могу использовать def , потому что мне нужно использовать такие функции, как setitem, getitem и т. д.
5 ответов
если то, что вы хотите, это способ превратить ваш класс В своего рода список без подклассов list , затем просто сделайте метод, который возвращает список:
если вы это имели в виду print MyClass() напечатает список, просто переопределите __repr__ :
изменить: Я вижу, вы имели в виду, как делать объекты сравнить. Для этого вы переопределяете __cmp__ метод.
я думаю, что вы очень смущены тем, что происходит.
в Python все является объектом:
- [] (список) является объектом
- ‘abcde’ (строка) является объектом
- 1 (целое число) является объектом
- MyClass() (экземпляр) является объектом
- MyClass (класс) также является объектом
- list (типа как класс) тоже объект
когда вы вызываете объект класса (например, MyClass() или list() ), он возвращает экземпляр этого класса. ( list действительно тип, а не класс, но я немного упрощаю здесь.)
когда вы печати объект (т. е. получить строковое представление объекта), этот объект __str__ или __repr__ магический метод вызывается и возвращаемое значение печати.
Итак, то, что вы просите: «мне нужно, чтобы MyClass вернул список, например list (), а не информацию об экземпляре», не имеет никакого смысла. list() возвращает экземпляр списка. MyClass() возвращает экземпляр MyClass. Если вам нужен экземпляр списка, просто получите экземпляр списка. Если вместо вопроса как выглядят эти объекты, когда вы print их или посмотреть на них в консоли, затем создать __str__ и __repr__ метод, который представляет их как вы хотите, чтобы они были представлены.
обновление для нового вопроса о равенстве
еще раз __str__ и __repr__ только для печати, и не влияют на объект каким-либо другим образом. Просто потому, что два объекта имеют одно и то же __repr__ значение не означает, что они равны!
MyClass() != MyClass() потому что ваш класс не определяет, как они будут равны, поэтому он возвращается к поведению по умолчанию ( object type), то есть объекты равны только самим себе:
если вы хотите изменить это, используйте один из магических методов сравнения
например, вы можете иметь объект, который равен всем:
я думаю, что вы должны сделать две вещи:
обоснуйте, почему вы не подклассы list если то, что вы хотите, очень похоже на список. Если подклассы не подходят, вы можете делегировать экземпляр обернутого списка вместо:
теперь это будет действовать как список, не будучи списком (т. е. без подклассов list ).