Python:从对象

时间:2015-04-30 13:21:53

标签: python python-2.7 attributes integer

我最近发现我可以用Python做到这一点:

>>> obj = type("SomeObj", (), {1: "a", 2: "b", 3: "c"})()
>>> obj
<__main__.SomeObj object at 0x123456789>

对象obj肯定具有123属性,dir()显示:

>>> dir(obj)
[1, 2, 3, '__class__', '__delattr__', '__dict__', ...]

但是,我无法检索三个属性之一的值。

>>> obj.1
  File "<stdin>", line 1
    obj.1
        ^
SyntaxError: invalid syntax

>>> getattr(obj, "1")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'ObjectifiedDict' object has no attribute '1'

>>> obj.__getattribute__(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: attribute name must be string, not 'int'

有没有办法做到这一点? 我知道使用整数作为属性名称通常是一个糟糕的想法,它只会让我感到好奇。

2 个答案:

答案 0 :(得分:2)

您正在将一个dict传递给可以使用int作为键的类型,没有检入类型以查看您是否传递了有效的name,因此您得到 SyntaxError 尝试稍后访问该属性:

  

标识符(也称为名称)由以下&gt;词法定义描述:       identifier :: =(letter |“”)(字母|数字|“”)*

该属性必须作为字符串传递给 hasattr getattr ,其中在尝试查找之前会引发异常。

PyDoc_STRVAR(hasattr_doc,
"hasattr(object, name) -> bool\n\
\n\
Return whether the object has an attribute with the given name.\n\
(This is done by calling getattr(object, name) and catching exceptions.)");


PyDoc_STRVAR(getattr_doc,
"getattr(object, name[, default]) -> value\n\
\n\
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
When a default argument is given, it is returned when the attribute doesn't\n\
exist; without it, an exception is raised in that case.");



if (!PyString_Check(name)) {
    PyErr_SetString(PyExc_TypeError,
                    "hasattr(): attribute name must be string");
    return NULL;
}



if (!PyString_Check(name)) {
    PyErr_SetString(PyExc_TypeError,
                    "getattr(): attribute name must be string");
    return NULL;
}

bltinmodule.c

typeobject.c

由于上面列出的原因,

整数作为属性名称通常是一个坏主意应该是不可能的

你会在python 3中使用TypeError: unorderable types: int() < str()获得dir,因为属性会被排序:

PyDoc_STRVAR(dir_doc,
"dir([object]) -> list of strings\n"
"\n"
"If called without an argument, return the names in the current scope.\n"
"Else, return an alphabetized list of names comprising (some of) the attributes\n"
"of the given object, and of attributes reachable from it.\n"
"If the object supplies a method named __dir__, it will be used; otherwise\n"
"the default dir() logic is used and returns:\n"
"  for a module object: the module's attributes.\n"
"  for a class object:  its attributes, and recursively the attributes\n"
"    of its bases.\n"
"  for any other object: its attributes, its class's attributes, and\n"
"    recursively the attributes of its class's base classes.");

答案 1 :(得分:1)

您可以访问123参数

obj = type("SomeObj", (), {1: "a", 2: "b", 3: "c"})()
obj.__class__.__dict__[1]
obj.__class__.__dict__[2]
obj.__class__.__dict__[3]

但不确定为什么会有效.....如果有人可以编辑我的帖子,解释它 这适用于python 3.4.1和Python 2.7.6

编辑感谢Veedrac

vars(type(obj))[1]
vars(type(obj))[2]
vars(type(obj))[3]

仅限编辑2阅读

但是这些属性是只读的

vars(type(obj))[1]="change"  # or obj.__class__.__dict__[1]="change"
  

追踪(最近一次呼叫最后一次):

     

文件“”,第1行,

     

TypeError:'dictproxy'对象不支持项目分配

 setattr(type(obj), 1, "change")
  

追踪(最近一次呼叫最后一次):

     

文件“”,第1行,

     

TypeError:属性名称必须是字符串,而不是'int'