Python - я, не я и cls

Еще один вопрос о том, для чего "я", что произойдет, если вы не используете "я" и что "cls" для. Я "сделал свою домашнюю работу", я просто хочу убедиться, что у меня все получилось.

self - Чтобы получить доступ к атрибуту объекта, вам необходимо префикс имени атрибута с именем объекта (objname.attributename). Точно так же self используется для доступа к атрибуту внутри самого объекта (класса). Поэтому, если вы не префикс переменной с self в методе класса, вы не сможете получить доступ к этой переменной в других методах класса или вне класса. Поэтому вы можете опустить это, если хотите сделать переменную локальной только для этого метода. Точно так же, если у вас есть метод, и у вас не было переменной, которую вы хотели бы поделиться с другими методами, вы можете опустить self из аргументов метода.

cls - Каждый экземпляр создает свою собственную "копию" атрибутов, поэтому, если вы хотите, чтобы все экземпляры класса имели одну и ту же переменную, вы должны префикс этого имени переменной "cls" в классе декларация.

Все ли в порядке? Спасибо.

Ответы

Ответ 1

Точно так же self используется для доступа к атрибуту внутри самого объекта (класса).

Не внутри объекта/класса, просто внутри методов экземпляра класса. self - это просто соглашение, вы можете называть его любым, что вы хотели, даже что-то другое в каждом методе.

Итак, если вы не префикс переменной с self в методе класса, вы не сможете получить доступ к этой переменной в других методах класса или вне класса.

self используется в методах экземпляра, cls часто используется в методах класса. В противном случае, исправьте.

Таким образом, вы можете опустить это, если хотите сделать переменную local только для этого метода.

Да, внутри метода имя переменной похоже на любую другую функцию - интерпретатор ищет имя локально, затем в закрытии, затем на уровне глобалов/модулей, затем в встроенных встроенных Python.

Точно так же, если у вас есть метод, и у вас нет какой-либо переменной, которую вы хотели бы поделиться с другими методами, вы можете опустить self из аргументов метода.

Нет, вы не можете просто опустить "я" из аргументов метода. Вы должны сказать Python, что хотите staticmethod, который не получит автоматически экземпляр класса, ether, выполнив @staticmethod над строкой def или mymethod = staticmethod(mymethod) под телом метода.

Каждый экземпляр создает свою собственную "копию" атрибутов, поэтому, если вы хотите, чтобы все экземпляры класса использовали одну и ту же переменную, вы должны префикс этого имени переменной с помощью "cls" в объявлении класса.

Внутри определения класса, но вне любых методов, имена привязаны к классу - то, как вы определяете методы и т.д. Вы не префикс их cls или что-либо еще.

cls обычно используется в __new__ special staticmethod или в classmethod s, который вы делаете аналогично staticmethod s. Это методы, которым нужен только доступ к классу, но не к вещам, специфичным для каждого экземпляра класса.

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

Подобно self, cls - это просто соглашение, и вы можете называть его любым, что вы хотели.

Краткий пример:

class Foo(object):

    # you couldn't use self. or cls. out here, they wouldn't mean anything

    # this is a class attribute
    thing = 'athing'

    def __init__(self, bar):
        # I want other methods called on this instance of Foo
        # to have access to bar, so I create an attribute of self
        # pointing to it
        self.bar = bar

    @staticmethod
    def default_foo():
        # static methods are often used as alternate constructors,
        # since they don't need access to any part of the class
        # if the method doesn't have anything at all to do with the class
        # just use a module level function
        return Foo('baz')

    @classmethod
    def two_things(cls):
        # can access class attributes, like thing
        # but not instance attributes, like bar
        print cls.thing, cls.thing

Ответ 2

Вы используете self в качестве первого аргумента в обычных методах, где экземпляр автоматически передается через этот аргумент. Итак, каков бы ни был первый аргумент в методе - он указывает на текущий экземпляр

Когда метод украшен @classmethod, он получает класс, переданный как его первый аргумент, поэтому наиболее распространенное имя для него - cls, поскольку оно указывает на класс.

Обычно вы не префикс каких-либо переменных (венгерское обозначение плохое).


Вот пример:

class Test(object):
    def hello(self):
        print 'instance %r says hello' % self
    @classmethod
    def greet(cls):
        print 'class %r greet you' % cls

Вывод:

>>> Test().hello()
instance <__main__.Test object at 0x1f19650> says hello

>>> Test.greet()
class <class '__main__.Test'> greet you