Классы Python, не получающие ожидаемых возвращаемых значений, путают с внутренними методами - PullRequest
0 голосов
/ 04 октября 2018

Я изучаю Python, и я борюсь с Classject, у меня есть следующий класс:

class Delivery(object):
    def __init__(self, recipient, nn, cost, weight):
        self.name = recipient
        self.value = nn
        self.cost = cost
        self.weight = weight

    def get_recipient(self):
        return self.name

    def get_priority_category(self):
        if self.get_priority_value >= 8:
            return "Urgent"
        elif self.get_priority_value >= 5 and self.get_priority_value <= 7:
            return "High"
        elif self.get_priority_value >= 3 and self.get_priority_value <= 4:
            return "Medium"
        elif self.get_priority_value < 3:
            return "Low"

    def get_priority_value(self):
        return self.nn

    def get_cost(self):
        return self.cost

    def get_weight(self):
        return self.weight

    def get_cw_ratio(self):
        ratio = self.cost / self.weight
        return str(round(ratio, 2))

    def __str__(self):        
        return '<' + self.get_recipient + ', ' + str(self.get_priority_category)+ ', ' + str(self.get_cost)+ ', ' + str(self.get_weight) + '>'

Я ожидаю, что это произойдет так:

PackageOne = Delivery('John', 1, 2, 4)
print(PackageOne)

результат долженбыть <John, Low, 2, 4>

как я получу следующее

<John, <bound method Delivery.get_priority_category of <__main__.Delivery object at 0x110866860>>, <bound method Delivery.get_cost of <__main__.Delivery object at 0x110866860>>, <bound method Delivery.get_weight of <__main__.Delivery object at 0x110866860>>>

Мне кажется, что я не использую правильный возврат методов?

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Вы не вызывали все свои методы, поэтому результаты не были распечатаны:

class Delivery(object):
    def __init__(self, recipient, nn, cost, weight):
        self.name = recipient
        self.nn = nn
        self.cost = cost
        self.weight = weight

    def get_recipient(self):
        return self.name

    def get_priority_category(self):
        if self.get_priority_value() >= 8:
            return "Urgent"
        elif self.get_priority_value() >= 5 and self.get_priority_value() <= 7:
            return "High"
        elif self.get_priority_value() >= 3 and self.get_priority_value() <= 4:
            return "Medium"
        elif self.get_priority_value() < 3:
            return "Low"

    def get_priority_value(self):
        return self.nn

    def get_cost(self):
        return self.cost

    def get_weight(self):
        return self.weight

    def get_cw_ratio(self):
        ratio = self.cost / self.weight
        return str(round(ratio, 2))

    def __str__(self):
        return '<' + self.get_recipient() + ', ' + str(self.get_priority_category()) + ', ' + str(self.get_cost()) + ', ' + str(self.get_weight()) + '>'


PackageOne = Delivery('John', 1, 2, 4)
print(PackageOne)

Возвращает:

<John, Low, 2, 4>
0 голосов
/ 05 октября 2018

Методы должны вызываться путем добавления (), а также вы ссылались на nn, который должен быть изменен на value.

class Delivery(object):
    def __init__(self, recipient, nn, cost, weight):
        self.name = recipient
        self.value = nn
        self.cost = cost
        self.weight = weight

    def get_recipient(self):
        return self.name

    def get_priority_category(self):
        if self.get_priority_value() >= 8:
            return "Urgent"
        elif self.get_priority_value() >= 5 and self.get_priority_value() <= 7:
            return "High"
        elif self.get_priority_value() >= 3 and self.get_priority_value() <= 4:
            return "Medium"
        elif self.get_priority_value() < 3:
            return "Low"

    def get_priority_value(self):
        return self.value

    def get_cost(self):
        return self.cost

    def get_weight(self):
        return self.weight

    def get_cw_ratio(self):
        ratio = self.cost() / self.weight()
        return str(round(ratio, 2))

    def __str__(self):        
        return '<' + str(self.get_recipient()) + ', ' + str(self.get_priority_category())+ ', ' + str(self.get_cost())+ ', ' + str(self.get_weight()) + '>'

PackageOne = Delivery('John', 1, 2, 4)
print(PackageOne)
0 голосов
/ 04 октября 2018

Вы не вызываете ваши методы.Вам показано представление самих объектов метода, а не их результаты.

Добавление () вызовов:

def __str__(self):        
    return (
        '<' + self.get_recipient() + ', ' +
              self.get_priority_category() + ', ' + 
              str(self.get_cost()) + ', ' +
              str(self.get_weight()) + 
        '>')

Я отбросил избыточные str() вызовы (get_recipient() и get_priority_category() уже генерируют строки) и добавили (...) вокруг выражения, чтобы его можно было разбить на несколько строк для удобства чтения.

Не то, что вам нужно для большинства этих методов, потому что выможет просто получить доступ к базовым атрибутам напрямую:

def __str__(self):        
    return (
        '<' + self.name + ', ' +
              self.get_priority_category() + ', ' + 
              str(self.cost) + ', ' +
              str(self.weight) + 
        '>')

В Python вы, как правило, не используете функции доступа, не тогда, когда прямой доступ к атрибуту будет достаточным.Это отличается от языков, таких как Java, где сложно заменить доступ к атрибутам функцией доступа после факта.В Python тривиально перейти на использование property позже, поэтому бесплатное использование атрибутов обходится бесплатно.

Вышесказанное можно упростить, используя форматирование строк;для Python 3.6 и выше используйте f-строку:

def __str__(self):        
    return f'<{self.name}, {self.get_priority_category()}, {self.cost}, {self.weight}>'

, в противном случае используйте str.format(), чтобы сделать то же самое:

def __str__(self):        
    return '<{}, {}, {}, {}>'.format(
        self.name, self.get_priority_category(), self.cost, self.weight)

При использовании строкового форматирования никаких вызовов str()необходимы, и вы экономите много набрав ' и + символов.

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