Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
a["copy"].foo.update возвращает 'bar'. Но это порождает другую проблему: перекрытие нативных методов с последующими трудноуловимыми багами там, где они используются.c = Dict({'a':1,'b':{'c':3,'d':4}}), судя по коду, не будут доступны через точку аттрибуты внутренних словарейdef validDictProperty(name, value):
return not callable(value) and not isinstance(value, (property, classmethod, staticmethod))
class DictMetaclass(type):
def __init__(cls, name, bases, namespace):
cls.default = {}
for base in bases:
if hasattr(base, "default"):
cls.default.update(base.default)
cls.default.update((k, v) for k, v in namespace.items() if validDictProperty(k, v))
class Dict(dict):
__metaclass__ = DictMetaclass
def __new__(cls, *args, **kwargs):
self = dict.__new__(cls)
self.update(cls.default)
self.__dict__ = self
return self
class Storage(dict):
"""
A Storage object is like a dictionary except `obj.foo` can be used
in addition to `obj['foo']`.
>>> o = Storage(a=1)
>>> print o.a
1
>>> o['a']
1
>>> o.a = 2
>>> print o['a']
2
>>> del o.a
>>> print o.a
None
"""
def __getattr__(self, key):
if key in self:
return self[key]
else:
return None
def __setattr__(self, key, value):
if value == None:
if key in self:
del self[key]
else:
self[key] = value
def __delattr__(self, key):
if key in self:
del self[key]
else:
raise AttributeError, "missing key=%s" % key
def __repr__(self):
return '<Storage ' + dict.__repr__(self) + '>'
def __getstate__(self):
return dict(self)
def __setstate__(self, value):
for (k, v) in value.items():
self[k] = v
class D(object): pass d = D() d.foo = "foo"
def get_public_attrs(self):
return filter(lambda (a,b): a[0] != '_', self.__dict__.items())
Реализация объектов-словарей, как в Javascript