Python中的运行时对象创建

时间:2014-07-03 10:16:41

标签: python

我希望在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

我的问题如下:

  1. .__dict__['predefined_property'] = 5.predefined_property = 5之间是否存在差异?
  2. 点定位是否只读类定义之外(即self.new_property =除外)? (据我所知,情况就是这样)
  3. 如果是这样,为什么?输入安全吗?
  4. 我有办法解决这个问题吗?有没有一个点符号调用的方法,我可以在我自己的课堂上肆意覆盖,比如MessyObject
  5. 当然,我可以使用字典对象来达到类似效果。我真的要问这个问题以了解更多信息。

1 个答案:

答案 0 :(得分:3)

您收到错误的原因是object是在C中定义的Python类。无法扩展。其他基于内部/ C的类(例如strlist

也是如此
 > 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:见上文。