Доступ к переменным-членам класса в Python? - PullRequest
63 голосов
/ 08 августа 2010
class Example(object):
    def the_example(self):
        itsProblem = "problem"

theExample = Example()
print(theExample.itsProblem)

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

def return_itsProblem(self):
    return itsProblem

Но и это не так.

Ответы [ 4 ]

115 голосов
/ 08 августа 2010

Ответ, в нескольких словах

В вашем примере 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 

отпечатков

Правда

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

Действительно, в 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 как соглашение. И вы добавляете только переменную к этому объекту так же, как вы делаете это снаружи. 1050 *

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

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

class Example(object):
    itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

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

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

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

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

10 голосов
/ 08 августа 2010

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

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.
0 голосов
/ 24 мая 2017

Реализуйте оператор возврата, как в примере ниже! Вы должны быть хорошими. Надеюсь, это кому-нибудь поможет ..

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


theExample = Example()
print theExample.the_example()
0 голосов
/ 27 октября 2016

Если у вас есть функция экземпляра (то есть та, которая передается self), вы можете использовать self, чтобы получить ссылку на класс, используя self.__class__

Например, в приведенном ниже коде tornado создает экземпляр для обработки запросов get, но мы можем получить класс get_handler и использовать его для хранения клиента riak, поэтому нам не нужно создавать его для каждого запроса.

import tornado.web
import riak

class get_handler(tornado.web.requestHandler):
    riak_client = None

def post(self):
    cls = self.__class__
    if cls.riak_client is None:
        cls.riak_client = riak.RiakClient(pb_port=8087, protocol='pbc')
    # Additional code to send response to the request ...
...