我正在寻找一种方法来创建一个基本的python“对象”,我可以在外部为其分配属性 目前我的做法如下:
我用
定义一个空类class C(object):
pass
然后我实例化一个对象并分配如下属性:
c = C()
c.attr = 2
有没有办法实例化一个空的类对象,然后我可以在不定义class C
的情况下分配如上所示的属性?
是否还有其他更好的方法来实现我的目标?
答案 0 :(得分:6)
看起来您正在寻找一个没有方法的灵活容器,并且可以使用任意名称的属性。那是dict
。
d = dict()
d['myattr'] = 42
如果您更喜欢使用类(c.myattr = 42
)获得的属性语法,那么请根据问题中的代码使用类。
答案 1 :(得分:4)
有没有办法实例化一个空类对象,然后我可以在不定义类C的情况下分配如上所示的属性?
是:
>>> C = type("C", (object,), {})
>>> c = C()
>>> c.attr = 2
但正如您所看到的,它并没有太大的改进,最终结果是相同的 - 它只是另一种创建相同类C
的方式。
<强>附录:强>
你可以通过&#34;隐藏&#34;它在一个函数中:
def attr_holder(cls=type("C", (object,), {})):
return cls()
c = attr_holder()
c.attr = 2
虽然这只是重新发明轮子 - 用
替换两行功能class attr_holder(object):
pass
并且它的工作方式完全一致,我们已经完整了。所以:跟David或Reorx建议的那样。
答案 2 :(得分:2)
我很久以前就遇到过同样的问题,然后在我的很多项目中创建这个类:
class DotDict(dict):
"""
retrieve value of dict in dot style
"""
def __getattr__(self, key):
try:
return self[key]
except KeyError:
raise AttributeError('has no attribute %s' % key)
def __setattr__(self, key, value):
self[key] = value
def __delattr__(self, key):
try:
del self[key]
except KeyError:
raise AttributeError(key)
def __str__(self):
return '<DotDict %s >' % self.__to_dict()
def __to_dict(self):
return dict(self)
当我想要一个对象存储数据或想要从dict中轻松检索值时,我总是使用这个类。
此外,它可以帮助我序列化我在对象中设置的属性,并在需要时反向获取原始字典。
所以我认为在许多情况下这可能是一个很好的解决方案,尽管其他技巧看起来很简单, 他们不是很有帮助。