Python - я, нет я и cls - PullRequest
       21

Python - я, нет я и cls

49 голосов
/ 26 сентября 2011

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

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

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

Это всеправо?Спасибо.

Ответы [ 2 ]

84 голосов
/ 26 сентября 2011

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

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

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

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

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

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

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

Нет, вы не можете просто опустить "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
10 голосов
/ 26 сентября 2011

Вы используете 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
...