class Example(object):
def the_example(self):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
Как мне получить доступ к переменной класса? Я пробовал добавить это определение:
def return_itsProblem(self):
return itsProblem
Тем не менее, это тоже не удается.
Ответы:
Ответ в двух словах
В вашем примере
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
asthis
, но это немного больше.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 являются экземплярами и, следовательно, самими объектами, что дает новое понимание для понимания вышеизложенного. Вернитесь и прочтите это еще раз позже, как только вы это поймете.
источник
theExample.itsProblem
он автоматически устанавливается равнымExample.itsProblem
, но с практической точки зрения * это совсем не та же переменная и может быть изменен независимо. *: на самом деле он начинается как один и тот же объект, но очень легко случайно изменить это, если вы не понимаете привязкуВы объявляете локальную переменную, а не переменную класса. Чтобы установить переменную экземпляра (атрибут), используйте
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.
источник
Если у вас есть функция экземпляра (т.е. та, которая передается self), вы можете использовать self, чтобы получить ссылку на класс, используя
self.__class__
Например, в приведенном ниже коде tornado создает экземпляр для обработки запросов на получение, но мы можем получить
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 ...
источник
Реализуйте оператор return, как в примере ниже! У тебя должно быть хорошо. Надеюсь, это кому-то поможет ..
class Example(object): def the_example(self): itsProblem = "problem" return itsProblem theExample = Example() print theExample.the_example()
источник