Python - я, нет я и cls

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

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

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

Это все в порядке? Благодарю.

2 ответа

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

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

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

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

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

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

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

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

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

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

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

Внутри 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

Ты используешь 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
Другие вопросы по тегам