#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
аргумент. Но я бы все равно использовал статические методы, если вам не нужно работать с параметрами класса.