Назначить две функции для класса? - PullRequest
1 голос
/ 02 апреля 2019
class Math:

    def __init__(self, number):
        self.number = number

    def add(self, add_num):
        return self.number + add_num

    def sub(self, sub_num):
        return self.number - sub_num

Math (5) .add (5)

Я получаю 10, как и ожидалось

Но если я делаю Math(5).add(5).sub(3): я получаю эту ошибкуAttributeError: 'int' object has no attribute 'sub'

Ответы [ 4 ]

4 голосов
/ 02 апреля 2019

, чтобы ваши методы работали, необходимо вернуть self (или свежий экземпляр Math):

class Math:

    def __init__(self, number):
        self.number = number

    def add(self, add_num):
        self.number += add_num
        return self
        # or:
        # return Math(self.number + add_num)

    def sub(self, sub_num):
        self.number -= sub_num
        return self
        # or:
        # return Math(self.number - add_num)

    def __str__(self):
        return str(self.number)

m = Math(5).add(5).sub(3)
print(m)
# 7

add здесь теперь ведет себя больше как __iadd__.

2 голосов
/ 02 апреля 2019

Конечно.

То, что вы делаете, по сути

a = Math(5) # a is a "Math" object
b = a.add(5) # b is what add() returns, i. e. an int
c = b.sub(3) # an int has no sub() method

Я не знаю, чего именно вы хотите достичь: хотите ли вы добавить add () и sub ()объект, на котором вы работаете?В этом случае вы можете сделать

class Math:

    def __init__(self, number):
        self.number = number

    def add(self, add_num):
        self.number = self.number + add_num
        return self

    def sub(self, sub_num):
        self.number = self.number - sub_num
        return self

Если вы не хотите этого, вы можете сделать вместо этого

class Math:

    def __init__(self, number):
        self.number = number

    def add(self, add_num):
        return Math(self.number + add_num)

    def sub(self, sub_num):
        return Math(self.number - sub_num)

        return self

В обоих случаях ваш предполагаемый способ объединения вызовов работает.

0 голосов
/ 02 апреля 2019

Когда вы выполняете return self.number + add_num, вы возвращаете целое число, а не экземпляр вашего класса Math. Чтобы решить эту проблему, вы можете изменить метод добавления на return Math(self.number + add_num).

0 голосов
/ 02 апреля 2019

Возвращаемое вами значение не является объектом вашего Math класса. Вы должны создать объект Math, чей атрибут number - это ваши вычисленные результаты, и вернуть его, чтобы ваш код работал.

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