Форум сайта python.su
Всем привет!
подскажите, пожалуйста, как сделать лучше и что я упустил :)
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)
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)
Отредактировано (Март 12, 2007 07:47:14)
Офлайн
pythonwinСмотря какая задача стоит, из кода сложно понять для чего тебе это надо.
подскажите, пожалуйста, как сделать лучше и что я упустил
Офлайн
Классно!
Я совсем новичек в 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?
Офлайн
Офлайн
if name!='__' and name!='__':
можно заменить на:
if name.startswith('__') and name.endswith('__'):
длиннее, но красивее, ИМХО.
Офлайн
Tmr__varname__ - это не защищенные свойства. они открыты всем
А вот так можно добавлять свои защищенные поля и даже обходить контроль доступа в классах:
Офлайн
to Daevaorn:
здесь, под “защищенный” имеется в виду “с контролируемым функцией __setattr__ доступом”
Офлайн
Tmrвсё равно не понимаю, но ладно…
здесь, под “защищенный” имеется в виду “с контролируемым функцией __setattr__ доступом”
Офлайн