вызов функции из класса в python — другой способ

#python #oop #class #methods

#python #ооп #класс #методы

Вопрос:

РЕДАКТИРОВАНИЕ 2: Спасибо всем за вашу помощь! РЕДАКТИРОВАТЬ: при добавлении @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 досье. На этот раз я удалил функцию инициализации.

 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)»

Ответ №1:

вы должны использовать 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)
 

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

 print MathOperation.testAddtion(2,3)
 

это выдает ошибку «Ошибка типа: несвязанный метод»

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

Например:

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

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

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

 print MathsOperations.testAddition(2,3)
 

Комментарии:

1. так тег @staticmethod автоматически вводит параметр self?

2. если вы используете @staticmethod, вы можете использовать класс, не объявляя сначала переменную, например, в этом случае, если вы попытаетесь использовать MathOperation.testAddtion(2,3), он выдает ошибку «Ошибка типа: несвязанный метод»

3. Нет, декоратор staticmethod устраняет необходимость в параметре self .

4. ‘tmp = MathOperations’ должно быть ‘tmp = MathOperations ()’.

Ответ №2:

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

ИМХО: объектно-ориентированное программирование на Python довольно сильно отстой.

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

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

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

Внимательно прочитайте эти страницы:

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

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

Комментарии:

1. добро пожаловать! кстати, прямой ответ заключается в том, что вы получаете ошибку, потому что интерпретатор добавляет self параметр для связанных методов, так что в итоге вы получаете три ( self плюс два предоставленных вами целых числа).

2. ах! это объяснение имело смысл. Я вообще устал от оригинальных документов python, поскольку они не подходят для новичков, предпочитая использовать сайты типа «a byte of python».

Ответ №3:

 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())
 

Ответ №4:

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

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

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

Комментарии:

1. Я редактировал вопрос. не могли бы вы объяснить, что там за ошибка типа? я привожу только два аргумента, но там написано 3 аргумента.

Ответ №5:

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

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

документы: http://docs.python.org/library/functions.html#staticmethod

Комментарии:

1. @RishavSharan Нет проблем, в других ответах уже упоминается отсутствующий self аргумент. Но я бы все равно использовал статические методы, если вам не нужно работать с параметрами класса.