вызов функции из класса в python-по-другому

EDIT2: спасибо всем за помощь! EDIT: при добавлении @staticmethod он работает. Однако мне все еще интересно, почему я получаю ошибку типа здесь.

Я только что начал OOPS и совершенно новичок в этом. У меня есть очень простой вопрос относительно различных способов вызова функции из класса. У меня есть testClass.py файл с кодом:

class MathsOperations:
    def __init__ (self, x, y):
        self.a = x
        self.b = y
    def testAddition (self):
        return (self.a + self.b)

    def testMultiplication (self):
        return (self.a * self.b)

Я вызываю этот класс из другого файла под названием main.py со следующим код:

from testClass import MathsOperations

xyz = MathsOperations(2, 3)
print xyz.testAddition()

это работает без каких-либо проблем. Тем не менее, я хотел использовать класс намного проще.

теперь я поместил следующий код в testClass.py файл. На этот раз я отбросил функцию init.

class MathsOperations:
    def testAddition (x, y):
        return x + y

    def testMultiplication (a, b):
        return a * b

вызов этого использования;

from testClass import MathsOperations
xyz = MathsOperations()
print xyz.testAddition(2, 3)

это не работает. Может ли кто-нибудь объяснить, что происходит неправильно в случае 2? Как мне использовать этот класс?

ошибка, которую я получаю: "TypeError: testAddition() занимает ровно 2 аргумента (3 дан)"

5 ответов


вы должны использовать self в качестве первого параметра метода

во втором случае вы должны использовать

class MathOperations:
    def testAddition (self,x, y):
        return x + y

    def testMultiplication (self,a, b):
        return a * b

и в вашем коде вы можете сделать следующее

tmp = MathOperations
print tmp.testAddition(2,3)

если вы используете класс без создания экземпляра переменной first

print MathOperation.testAddtion(2,3)

это дает вам ошибку "TypeError: unbound method"

если вы хотите сделать это, вам понадобится @ staticmethod decorator

например:

class MathsOperations:
    @staticmethod
    def testAddition (x, y):
        return x + y

    @staticmethod
    def testMultiplication (a, b):
        return a * b

затем в вашем коде вы можете использовать

print MathsOperations.testAddition(2,3)

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

IMHO: объектно-ориентированное программирование на Python сосет довольно много.

метод диспетчеризации не очень прост, вам нужно знать о связанном / несвязанном экземпляре / классе (и статическом!) методы; вы можете иметь множественное наследование и иметь дело с устаревшими и новыми классами стилей (ваш был старым стилем) и знать, как работает MRO, свойства...

вкратце: слишком сложно, с большим количеством вещей, происходящих под капотом. Позвольте мне сказать даже, это unpythonic, как есть много различных способов для достижения той же вещи.

мой совет: используйте ООП только тогда, когда это действительно полезно. Обычно это означает написание классов, которые реализуют хорошо известные протоколы и легко интегрируются с остальной частью системы. Не создавайте много классов только ради написания объектно-ориентированных код.

возьмите хорошее чтение на эту страницу:

вы найдете их весьма полезными.

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


ваши методы не ссылаются на объект (то есть на себя), поэтому вы должны используйте @staticmethod декоратор:

class MathsOperations:
    @staticmethod
    def testAddition (x, y):
        return x + y

    @staticmethod
    def testMultiplication (a, b):
        return a * b

вам нужно иметь экземпляр класса для использования его методов. Или, если вам не нужно обращаться ни к одной из переменных классов (не к статическим параметрам), вы можете определить метод как статический, и его можно использовать, даже если класс не создан. Просто добавьте @staticmethod декоратор для ваших методов.

class MathsOperations:
    @staticmethod
    def testAddition (x, y):
        return x + y
    @staticmethod
    def testMultiplication (a, b):
        return a * b

docs:http://docs.python.org/library/functions.html#staticmethod


class MathsOperations:
    def __init__ (self, x, y):
        self.a = x
        self.b = y
    def testAddition (self):
        return (self.a + self.b)

    def testMultiplication (self):
        return (self.a * self.b)

затем

temp = MathsOperations()
print(temp.testAddition())