Уведомления

Группа в Telegram: @pythonsu

#1 Март 12, 2007 07:08:47

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

контроль доступа в классах с динамически-создаваемыми свойствами

Всем привет!
подскажите, пожалуйста, как сделать лучше и что я упустил :)

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)



Отредактировано (Март 12, 2007 07:47:14)

Офлайн

#2 Март 12, 2007 12:10:11

Viper
От:
Зарегистрирован: 2006-11-08
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

контроль доступа в классах с динамически-создаваемыми свойствами

pythonwin
подскажите, пожалуйста, как сделать лучше и что я упустил
Смотря какая задача стоит, из кода сложно понять для чего тебе это надо.



Офлайн

#3 Март 13, 2007 10:47:32

Tmr
От:
Зарегистрирован: 2007-03-12
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

контроль доступа в классах с динамически-создаваемыми свойствами

Классно!
Я совсем новичек в 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?



Офлайн

#4 Март 13, 2007 12:07:49

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

контроль доступа в классах с динамически-создаваемыми свойствами

Офлайн

#5 Март 13, 2007 12:58:08

Mkdir
Зарегистрирован: 2006-06-30
Сообщения: 211
Репутация: +  0  -
Профиль   Отправить e-mail  

контроль доступа в классах с динамически-создаваемыми свойствами

if name!='__' and name!='__':

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

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

длиннее, но красивее, ИМХО.



Офлайн

#6 Март 13, 2007 16:15:07

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

контроль доступа в классах с динамически-создаваемыми свойствами

Tmr
А вот так можно добавлять свои защищенные поля и даже обходить контроль доступа в классах:
__varname__ - это не защищенные свойства. они открыты всем
__varname - это закрытое поле.



Офлайн

#7 Март 13, 2007 16:21:12

Tmr
От:
Зарегистрирован: 2007-03-12
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

контроль доступа в классах с динамически-создаваемыми свойствами

to Daevaorn:
здесь, под “защищенный” имеется в виду “с контролируемым функцией __setattr__ доступом”



Офлайн

#8 Март 13, 2007 18:41:51

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

контроль доступа в классах с динамически-создаваемыми свойствами

Tmr
здесь, под “защищенный” имеется в виду “с контролируемым функцией __setattr__ доступом”
всё равно не понимаю, но ладно…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version