Как печатный вызов работает на моем недавно созданном классе Python - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь узнать, как классы работают на Python, и новичок в этом, у меня есть следующий класс, определенный как 'Animal':

class Animal(object):
    def __init__(self, size, color, mood):
    # init: consists of statements that bind the parameters passed to init to the instance o f the class, when an instance
    # is created.
        self.size = size
        self.color = color
        self.mood = mood
        self.alive = True

    def feeling(self):
        # first method, methods are limited to the class, that is why their name does not need to be unique.
        return "The", self.color, str(self), " is feeling", self.mood, "."

    def colors(self, other):
        return "The", str(self), "is", self.color, "and the", str(other), "is", other.color, "."

Затем я создаю экземпляр объекта Animal как follow:

hippo = Animal("large", "purple", 'amused')

Наконец, я вызываю метод для моего объекта следующим образом:

print(hippo.feeling())

Я ожидаю получить вывод, как показано ниже:

"The purple hippo is feeling amused."

Но что я получу в выводе, если напечатаю тот же аргумент, что и выше:

('The', 'purple', '<__main__.Animal object at 0x7f43cc978160>', ' is feeling', 'amused', '.')

Может кто-нибудь объяснить, пожалуйста, почему вывод похож на список? также почему str (self) вернул имя объекта, а не слово hippo.

Оригинальный код в учебнике был написан на Python 3.5, я подумал, что это могло быть причиной, но я попробовал онлайновую IDE https://www.jdoodle.com/python3-programming-online/ для Python 3.5.1 и результат был таким же.

Ответы [ 4 ]

3 голосов
/ 03 апреля 2020

Вам нужно передать имя животного при его инициализации - класс не будет знать имя переменной.

class Animal(object):
    def __init__(self, name, size, color, mood):
    # init: consists of statements that bind the parameters passed to init to the instance of the class, when an instance
    # is created. 

    # pass the name to the class
        self.name = name
        self.size = size
        self.color = color
        self.mood = mood
        self.alive = True

    def feeling(self):
    # first method, methods are limited to the class, that is why their name does not need to be unique.
        return str("The " + self.color + " " + self.name + " is feeling " + self.mood + ".")

    def colors(self, other):
        return str("The ", self.name, " is " + self.color + " and the " + other.name, " is ", other.color, ".")

Вывод:

hippo = Animal("hippo", "large", "purple", 'amused')
print(hippo.feeling())
# The purple hippo is feeling amused.
0 голосов
/ 03 апреля 2020

Здесь есть несколько вещей, к которым нужно обратиться

  1. Возвращаемое значение из функции def feeling(self) является кортежем, когда возвращаемые значения разделяются запятой, функция возвращает кортеж, состоящий из всех возвращаемые значения. Следовательно, мы пытаемся напечатать его в виде списка. Так что либо верните строку, либо измените способ печати возвращаемых значений из кортежа.
  2. Вы хотите получить имя экземпляра объекта класса при его печати. т.е. hippo = Animal("large", "purple", 'amused') для этого вы ожидаете, что str (self) вернет имя экземпляра, что немного нетривиально. Сначала определите эту функцию def __str__(self):, чтобы получать желаемый результат всякий раз, когда вы используете str(self). Во-вторых, чтобы получить имя переменной, либо укажите имя в качестве переменной класса в конструкторе и используйте его, что было бы проще, либо вы можете использовать пакет python-varname, чтобы использовать функцию varname() для достижения этой цели.
class Klass:
    def __init__(self):
        self.id = varname()


k = Klass()
# k.id == 'k'
0 голосов
/ 03 апреля 2020

Отвечая @ Ch3steR, вы можете использовать __repr__ или __str__. Оба служат для этой цели. Пример как ниже:

>>> class Test:
...     def __repr__(self):
...         return "Test()"
...     def __str__(self):
...         return "member of Test"
... 
>>> t = Test()
>>> t
Test()
>>> print(t)
member of Test
0 голосов
/ 03 апреля 2020

Ваш метод использует запятые для разделения аргументов. Используйте f-строку и печатайте вместо возврата, как показано ниже:

print(f”The {self.size} {self.color} Animal is feeling {self.mood}.”)

Кроме того, вы ожидаете, что self каким-то образом вернет имя переменной. Вместо этого передайте тип животного в функцию в init .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...