Использование self внутри методов экземпляра в Python - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть такой класс

class Test:
    def __init__(self, var):
        self.var = var
    def test(self):
        x = self.var + 2
        return x

А потом я делаю такой класс

class Test:
    def __init__(self, var):
        self.var = var
    def test(self):
        self.x = self.var + 2
        return self.x

Я понимаю, что могу использовать self для разделения значений атрибутов между различными экземплярами этого класса. Мой вопрос: если я создаю много служебных переменных (например, x) внутри метода, я должен всегда создавать их, используя self?

Может кто-нибудь объяснить, как вышеупомянутые два класса ведут себя по-разному (если они так)?

1 Ответ

0 голосов
/ 14 ноября 2018

Давайте посмотрим на разницу между двумя классами:

class Test:
    def __init__(self, var):
        self.var = var
    def test(self):
        x = self.var + 2
        return x

Давайте создадим объект Test:

t = Test(1)

И посмотри, что мы можем сделать

t.var # 1
t.x # Raises AttributeError : no such attribute in the class
t.test() #3
t.x # Still erroring

А с твоим вторым классом

class Test:
    def __init__(self, var):
        self.var = var
    def test(self):
        self.x = self.var + 2
        return self.x

Давайте создадим объект Test:

t = Test(1)

И посмотрим, что мы можем сделать

t.var # 1
t.x # Raises AttributeError : no such attribute in the class
t.test() #3
t.x # 3

И что? Хорошо видно, что любые переменные, определенные с self.VARNAME, сохраняются в экземпляре, тогда как простые локальные переменные, без self., не существуют.

Однако, если x должен быть доступен с t.x, я бы, наверное, выбрал свойство, например

class Test:
    def __init__(self, var):
        self.var = var

    @property
    def x(self):
        x = self.var + 2
        return x

t = Test() 
t.x # 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...