2012-04-03 4 views
3

Я хотел бы изменить объект частной переменнойКак я могу достичь частной переменной внутри объекта

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' 

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

+2

Это не частные переменные. Они просто искалечены. Не ** ** используйте ** для неприкосновенности частной жизни, для чего это единственное подчеркивание. – delnan

+0

Вы забываете себя в модификации. def modifyTest (self, name = 'Test1', value) –

+0

thank, я отредактировал это –

ответ

6

Доступ извне:

e = Example() 
e._Example__myTest1 # 1 

Благодаря частной переменной name mangling rules.

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

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

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) 

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

+0

Я хотел бы получить доступ внутри класса, а не извне –

+0

@iUngi обновлен с внутренним доступом –

+0

@iUngi Если вы пишете этот класс, Ты делаешь это неправильно. В Python имя искаженных атрибутов - ужасная идея 99,99% времени. Почему вы используете их здесь? Если вы просто хотите что-то, что имеет отношение только к внутренней функции вашего класса, используйте одно подчеркивание. –

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

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

+0

обновлено ....... –

1

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

def modifyTest(name = 'Test1', value): 
    setattr(self, '_Example__my' + name, value) 

 Смежные вопросы

  • Нет связанных вопросов^_^