__init__ и аргументы в Python - PullRequest
32 голосов
/ 02 марта 2011

Я хочу понять аргументы конструктора __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 Thisвсе в порядке.

Но метод getone() не нуждается в аргументах.

Нужно ли использовать бессмысленный аргумент?

Ответы [ 5 ]

43 голосов
/ 02 марта 2011

В Python:

  • Методы экземпляра: требуется аргумент self.
  • Методы класса: принимают класс какпервый аргумент.
  • Статические методы: не требуют аргумента экземпляра (self) или класса (cls).

__init__ являетсяспециальная функция и без переопределения __new__ ей всегда будет дан экземпляр класса в качестве первого аргумента.

Пример использования встроенных декораторов метода и статического метода:

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 s, то более питонская вещь, которую нужно сделать, - создать новый модуль связанных функций.

6 голосов
/ 02 марта 2011

Каждый метод должен принимать один аргумент: сам экземпляр (или класс, если это статический метод).

Подробнее о классах в Python .

4 голосов
/ 02 марта 2011

Тот факт, что ваш метод не использует аргумент self (который является ссылкой на экземпляр, к которому присоединен метод), не означает, что вы можете его опустить.Он всегда должен быть там, потому что Python всегда будет пытаться передать его.

2 голосов
/ 02 марта 2011

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

2 голосов
/ 02 марта 2011

В python вы всегда должны передавать как минимум один аргумент методам класса, аргументом является self, и это не бессмысленно, это ссылка на сам экземпляр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...