Доступ к переменным-членам класса в Python?

class Example(object):
    def the_example(self):
        itsProblem = "problem"

theExample = Example()
print(theExample.itsProblem)

Как получить доступ к переменной класса? Я попытался добавить это определение:

def return_itsProblem(self):
    return itsProblem

Тем не менее, это также не удается.

68
задан Ciro Santilli 新疆改造中心法轮功六四事件 28 March 2017 в 13:49
поделиться

2 ответа

Краткий ответ

В вашем примере itsProblem является локальной переменной.

Вы должны использовать self для установки и получения переменных экземпляра. Вы можете установить его в методе __ init __ . Тогда ваш код будет:

class Example(object):
    def __init__(self):
        self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

Но если вам нужна настоящая переменная класса, используйте имя класса напрямую:

class Example(object):
    itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)
print (Example.itsProblem)

Но будьте осторожны с этим, поскольку theExample.itsProblem автоматически устанавливается равным равно Example.itsProblem , но это совсем не та же переменная и может быть изменена независимо.

Некоторые пояснения

В Python переменные можно создавать динамически. Следовательно, вы можете сделать следующее:

class Example(object):
    pass

Example.itsProblem = "problem"

e = Example()
e.itsSecondProblem = "problem"

print Example.itsProblem == e.itsSecondProblem 

печатает

True

Следовательно, это именно то, что вы делаете с предыдущими примерами.

Действительно, в Python мы используем self как this , но это немного больше. self - это первый аргумент любого метода объекта, потому что первым аргументом всегда является ссылка на объект. Это происходит автоматически, называете вы self или нет.

Это означает, что вы можете:

class Example(object):
    def __init__(self):
        self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

или:

class Example(object):
    def __init__(my_super_self):
        my_super_self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

Это точно то же самое. Первым аргументом метода ЛЮБОГО объекта является текущий объект, мы называем его self только по соглашению. И вы добавляете к этому объекту просто переменную, точно так же, как если бы вы делали это извне.

Теперь о переменных класса.

Когда вы сделаете:

class Example(object):
    itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

Вы заметите, что мы сначала устанавливаем переменную класса , затем мы обращаемся к переменной объекта (экземпляра) .Мы никогда не устанавливали эту объектную переменную, но она работает, как это возможно?

Ну, Python пытается сначала получить объектную переменную, но если не может ее найти, выдаст вам переменную класса. Предупреждение: переменная класса совместно используется экземплярами, а переменная объекта - нет.

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

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

118
ответ дан 24 November 2019 в 14:15
поделиться

Вы объявляете локальную переменную, а не переменную класса. Чтобы задать переменную экземпляра (атрибут), используйте

class Example(object):
    def the_example(self):
        self.itsProblem = "problem"  # <-- remember the 'self.'

theExample = Example()
theExample.the_example()
print(theExample.itsProblem)

Чтобы задать переменную класса (она же статический член), используйте

class Example(object):
    def the_example(self):
        Example.itsProblem = "problem"
        # or, type(self).itsProblem = "problem"
        # depending what you want to do when the class is derived.
10
ответ дан 24 November 2019 в 14:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: