Найти - Пользователи
Полная версия: контроль доступа в классах с динамически-создаваемыми свойствами
Начало » Python для экспертов » контроль доступа в классах с динамически-создаваемыми свойствами
1
pythonwin
Всем привет!
подскажите, пожалуйста, как сделать лучше и что я упустил :)
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
pythonwin
подскажите, пожалуйста, как сделать лучше и что я упустил
Смотря какая задача стоит, из кода сложно понять для чего тебе это надо.
Tmr
Классно!
Я совсем новичек в 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
if name!='__' and name!='__':

можно заменить на:

if name.startswith('__') and name.endswith('__'):

длиннее, но красивее, ИМХО.
Александр Кошелев
Tmr
А вот так можно добавлять свои защищенные поля и даже обходить контроль доступа в классах:
__varname__ - это не защищенные свойства. они открыты всем
__varname - это закрытое поле.
Tmr
to Daevaorn:
здесь, под “защищенный” имеется в виду “с контролируемым функцией __setattr__ доступом”
Александр Кошелев
Tmr
здесь, под “защищенный” имеется в виду “с контролируемым функцией __setattr__ доступом”
всё равно не понимаю, но ладно…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB