pythonwin
Март 12, 2007 07:08:47
Всем привет!
подскажите, пожалуйста, как сделать лучше и что я упустил :)
class DinamicObj(object):
def __init__(self, **kw):
for k in kw.keys():
setattr(self, k, kw[k])
def __setattr__(self, name, value):
if name[:2]!='__' and name[-2:]!='__':
print name
self.__dict__[name]=value
d1 = DinamicObj(a1=1, a2=2, a3=3, __a4__=5, __a5=6)
print dir(d1)
print в коде для наглядности - можно и убрать:
class DinamicObj(object):
def __init__(self, **kw):
for k in kw.keys():
setattr(self, k, kw[k])
def __setattr__(self, name, value):
if name[:2]!='__' and name[-2:]!='__':
self.__dict__[name]=value
d1 = DinamicObj(a1=1, a2=2, a3=3, __a4__=5, __a5=6)
print dir(d1)
Viper
Март 12, 2007 12:10:11
pythonwin
подскажите, пожалуйста, как сделать лучше и что я упустил
Смотря какая задача стоит, из кода сложно понять для чего тебе это надо.
Tmr
Март 13, 2007 10:47:32
Классно!
Я совсем новичек в Python, и чем больше о нем узнаю, тем больше он мне нравится своей гибкостью и открытостью!
А вот так можно добавлять свои защищенные поля и даже обходить контроль доступа в классах:
class DinamicObj(object):
def __init__(self, **kw):
for k in kw.keys():
setattr(self, k, kw)
object.__setattr__(self, “__my_hidden_const__”, “I'm almost constant! Try to owerwrite me in instance!”)
def __setattr__(self, name, value):
if name!='__' and name!='__':
print name
self.__dict__=value
d1 = DinamicObj(a1=1, a2=2, a3=3, __a4__=5, __a5=6)
print d1.__my_hidden_const__
d1.__my_hidden_const__ = “New value”
print d1.__my_hidden_const__
object.__setattr__(d1, “__my_hidden_const__”, “But I am not a really constant…”)
print d1.__my_hidden_const__
object.__setattr__(d1, “__a4__”, “And my protection was broken…”)
print d1.__a4__
А как можно реализовать совсем защищенные атрибуты класса? Возможно ли это в приципе в Python?
Mkdir
Март 13, 2007 12:58:08
if name!='__' and name!='__':
можно заменить на:
if name.startswith('__') and name.endswith('__'):
длиннее, но красивее, ИМХО.
Александр Кошелев
Март 13, 2007 16:15:07
Tmr
А вот так можно добавлять свои защищенные поля и даже обходить контроль доступа в классах:
__varname__ - это не защищенные свойства. они открыты всем
__varname - это закрытое поле.
Tmr
Март 13, 2007 16:21:12
to Daevaorn:
здесь, под “защищенный” имеется в виду “с контролируемым функцией __setattr__ доступом”
Александр Кошелев
Март 13, 2007 18:41:51
Tmr
здесь, под “защищенный” имеется в виду “с контролируемым функцией __setattr__ доступом”
всё равно не понимаю, но ладно…