Вызов функции из класса в Python - другой способ - PullRequest
9 голосов
/ 01 ноября 2011

EDIT2: Спасибо всем за помощь! РЕДАКТИРОВАТЬ: при добавлении @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? Как мне использовать этот класс?

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

Ответы [ 5 ]

18 голосов
/ 01 ноября 2011

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

, то выдает ошибку «TypeError: unbound method»

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

Например:

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

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

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

print MathsOperations.testAddition(2,3)
8 голосов
/ 01 ноября 2011

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

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

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

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

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

Внимательно прочитайте следующие страницы:

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

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

2 голосов
/ 01 ноября 2011

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

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

    @staticmethod
    def testMultiplication (a, b):
        return a * b
1 голос
/ 01 ноября 2011

Вам нужен экземпляр класса, чтобы использовать его методы.Или, если вам не нужен доступ к каким-либо переменным классов (не статическим параметрам), вы можете определить метод как статический, и его можно использовать, даже если класс не создан.Просто добавьте @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

0 голосов
/ 20 марта 2018
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())
...