вызов функции из класса в 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())