Подтвердить что ты не робот

__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() не нуждается в аргументах.

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

4b9b3361

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