我希望在Python中制作一个相对短暂的对象。在Javascript中,它具有类似于对象管理的内部语义(查找表),您可以执行以下操作:
/* Hopefully I'm not so out of practice with JS that this would cause an error: */
var not_a_defined_class;
not_a_defined_class.this_property_exists_as_of_this_line = 1
在Python中,你不能。等价物如下:
not_a_defined_class = object()
not_a_defined_class.__dict__['this_property_exists_as_of_this_line'] = 1
显然,访问类成员的点符号是语法糖:
class DefinedClass(object):
__init(self):
self.predefined_property = 2
defined_object = DefinedClass()
defined_object.predefined_property = 5
# Is syntactic sugar for:
defined_object.__dict__['predefined_property'] = 5
# But is read-only
defined_object.undefined_property = 6 # AttributeError
我的问题如下:
.__dict__['predefined_property'] = 5
和.predefined_property = 5
之间是否存在差异?self.new_property =
除外)? (据我所知,情况就是这样)MessyObject
?当然,我可以使用字典对象来达到类似效果。我真的要问这个问题以了解更多信息。
答案 0 :(得分:3)
您收到错误的原因是object
是在C中定义的Python类。无法扩展。其他基于内部/ C的类(例如str
和list
:
> a = 'x'
> a.foo = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'foo'
但你可以扩展这些类:
>>> class MyString(str): pass
...
>>> a = MyString()
>>> a.foo = 1
>>> len(a)
0
Re#1:对于Python代码中定义的类:通常不是。有一些极端情况,这就是你应该使用setattr()
的原因。
Re#2和#3:不。如上所述,这仅适用于内部类型。
Re#4:见上文。