Как я могу достичь приватной переменной внутри объекта - PullRequest
3 голосов
/ 03 апреля 2012

Я хотел бы изменить частную переменную объекта

class Example():
    __myTest1 = 1
    __myTest2 = 1
    def __init__(self):
        pass
    def modifyTest(self, name = 'Test1', value):
        setattr(self, '__my'+name, value);

Я попробовал приведенный выше код, и кажется, что невозможно достичь приватной переменной,

AttributeError: Example instance has no attribute '__myTest1'

Есть ли способ изменить приватную переменную?

Ответы [ 3 ]

6 голосов
/ 03 апреля 2012

Доступ снаружи:

e = Example()
e._Example__myTest1   # 1

Из-за закрытой переменной правила искажения имени .

Но если вам нужен доступ к личным пользователям, это свидетельствует о том, что в вашем дизайне что-то не так.

Если вам нужно получить доступ или обновить его из самого класса:

class Example():
    __myTest1 = 1
    __myTest2 = 1
    def __init__(self):
        pass

    @classmethod
    def modifyTest(cls, value, name="Test1"):
        setattr(cls, '_%s__my%s' % (cls.__name__, name), value)

Это должно быть сделано, потому что это закрытая статическая переменная класса, а не закрытая переменная экземпляра (в этом случае это будет просто)

1 голос
/ 03 апреля 2012

Попробуйте добавить одиночное подчеркивание и имя класса в начало переменной.

def modifyTest(name = 'Test1', value):
    setattr(self, '_Example__my' + name, value)
0 голосов
/ 03 апреля 2012
class Example():
    __myTest1 = 1
    __myTest2 = 1
    def __init__(self):
        pass
    def modifyTest(self, name, value):
        setattr(self, '__my'+name, value)

Необязательные переменные должны идти после обязательных переменных.

...