__init__ и аргументы в Python
Я хочу понять аргументы конструктора __init__
в Python.
class Num:
def __init__(self,num):
self.n = num
def getn(self):
return self.n
def getone():
return 1
myObj = Num(3)
print myObj.getn()
РЕЗУЛЬТАТ: 3
Я вызываю метод getone()
:
print myObj.getone()
РЕЗУЛЬТАТ: Ошибка 'getone()' не принимает аргументов (1given).
Итак, я заменяю:
def getone():
return 1
с
def getone(self):
return 1
РЕЗУЛЬТАТ: 1 Это нормально.
Но метод getone()
не нуждается в аргументах.
Нужно ли использовать бессмысленный аргумент?
Ответы
Ответ 1
Для методов экземпляра Python требуется аргумент self. Методы класса принимают класс в качестве первого аргумента. Статические методы не требуют либо экземпляра (self
), либо аргумента class (cls
).
__init__
является специальной функцией и без переопределения __new__
ей всегда будет задан экземпляр класса в качестве его первого аргумента.
Пример использования встроенных методов classmethod и staticmethod:
import sys
class Num:
max = sys.maxint
def __init__(self,num):
self.n = num
def getn(self):
return self.n
@staticmethod
def getone():
return 1
@classmethod
def getmax(cls):
return cls.max
myObj = Num(3)
# with the appropriate decorator these should work fine
myObj.getone()
myObj.getmax()
myObj.getn()
Тем не менее, я бы старался использовать @classmethod
/@staticmethod
экономно. Если вы обнаруживаете, что создаете объекты, состоящие из ничего, кроме staticmethod
, более сложная задача для pythonic состоит в создании нового модуля связанных функций.
Ответ 2
Каждый метод должен принимать один аргумент: сам экземпляр (или класс, если это статический метод).
Подробнее о классах в Python.
Ответ 3
Тот факт, что ваш метод не использует аргумент self
(который является ссылкой на экземпляр, к которому привязан метод), не означает, что вы можете его оставить. Он всегда должен быть там, потому что Python всегда будет пытаться передать его.
Ответ 4
В python вы должны всегда передавать хотя бы один аргумент методам класса, аргумент self
, и это не бессмысленно его ссылка на сам экземпляр
Ответ 5
Текущий объект явно передается методу в качестве первого параметра. self
- условное имя. Вы можете называть это чем угодно, но настоятельно рекомендуется придерживаться этого соглашения, чтобы избежать путаницы.