Метод вызова Python без 'self'

Итак, я только начал программировать на питоне, и я не понимаю все рассуждения за "я". Я понимаю, что он используется почти как глобальная переменная, поэтому данные могут передаваться между различными методами в классе. Я не понимаю, почему вам нужно использовать его при вызове другого метода в том же классе. Если я уже в этом классе, зачем мне это говорить?

Например, если у меня есть: Зачем мне нужно self.thing()?

class bla:
    def hello(self):
        self.thing()

    def thing(self):
        print "hello"

Ответ 1

Также вы можете создавать методы в классе static, поэтому нет необходимости в self. Однако используйте это, если вам это действительно нужно.

Yours:

class bla:
    def hello(self):
        self.thing()

    def thing(self):
        print "hello"

статическое издание:

class bla:
    @staticmethod
    def hello():
        bla.thing()

    @staticmethod
    def thing():
        print "hello"

Ответ 2

Одна из причин заключается в том, чтобы ссылаться на метод этого экземпляра конкретного экземпляра, в котором выполняется код.

Этот пример может помочь:

def hello():
    print "global hello"

class bla:
    def hello(self):
        self.thing()
        hello()

    def thing(self):
        print "hello"

b = bla()
b.hello()
>>> hello
global hello

На данный момент вы можете думать об этом как о разрешении пространства имен.

Ответ 3

Короткий ответ: "потому что вы можете def thing(args) как глобальную функцию или как метод другого класса. Возьмите этот (ужасный) пример:

def thing(args):
    print "Please don't do this."

class foo:
    def thing(self,args):
        print "No, really. Don't ever do this."

class bar:
    def thing(self,args):
        print "This is completely unrelated."

Это плохо. Не делай этого. Но если вы сделали, вы можете вызвать thing(args), и что-то произойдет. Это может быть полезно, если вы планируете соответственно:

class Person:
    def bio(self):
        print "I'm a person!"

class Student(Person):
    def bio(self):
        Person.bio(self)
        print "I'm studying %s" % self.major

Вышеприведенный код делает так, что если вы создадите объект класса Student и вызовите bio, он сделает все, что было бы, если бы это был класс Person, у которого был свой собственный bio называется и, после чего он сделает свое дело.

Это попадает в наследство и некоторые другие вещи, которые вы, возможно, еще не видели, но с нетерпением ждем его.

Ответ 4

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

Ответ 5

Для меня, я, как определитель области, с self.foo() и self.bar, указывающий функцию и параметр, определенные в классе, а не те, которые определены в других местах.

Ответ 6

Зеркало отражает разницу с java и python: java может использовать метод внутри класса без self, потому что единственный способ вызвать метод - это класс или obj, так что этот путь понятен для компилятора. Хотя это может сбить с толку переводчика python и потребует значительного времени на поиск таблицы символов по всему пространству имен во время выполнения, поскольку и функция, и метод класса являются потенциальными кандидатами на вызов функции, поскольку "self" не используется. Если использовать эту практику, скорость Python снова снизится по сравнению с C и Java, что может сделать его менее привлекательным.