相关疑难解决方法(0)

如何创建对象并向其添加属性?

我想在Python中创建一个动态对象(在另一个对象内),然后为其添加属性.

我试过了:

obj = someobject
obj.a = object()
setattr(obj.a, 'somefield', 'somevalue')
Run Code Online (Sandbox Code Playgroud)

但这没用.

有任何想法吗?

编辑:

我从for循环中设置属性,循环遍历值列表,例如

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我会得到obj.a.attr1,obj.a.attr2,obj.a.attr3.

我使用了这个setattr函数因为我不知道怎么做obj.a.NAME一个for循环.

如何根据p上面示例中的值设置属性?

python attributes class object

279
推荐指数
9
解决办法
30万
查看次数

为什么不能在python中向对象添加属性?

(用Python shell编写)

>>> o = object()
>>> o.test = 1

Traceback (most recent call last):
  File "<pyshell#45>", line 1, in <module>
    o.test = 1
AttributeError: 'object' object has no attribute 'test'
>>> class test1:
    pass

>>> t = test1()
>>> t.test

Traceback (most recent call last):
  File "<pyshell#50>", line 1, in <module>
    t.test
AttributeError: test1 instance has no attribute 'test'
>>> t.test = 1
>>> t.test
1
>>> class test2(object):
    pass

>>> t = test2()
>>> t.test = 1
>>> …
Run Code Online (Sandbox Code Playgroud)

python attributes instances

62
推荐指数
2
解决办法
3万
查看次数

如何在Python中创建具有属性的内联对象?

在Javascript中它将是:

var newObject = { 'propertyName' : 'propertyValue' };
Run Code Online (Sandbox Code Playgroud)

怎么用Python做?

python dynamic-languages instantiation

48
推荐指数
6
解决办法
3万
查看次数

无法为namedtuple的子类设置属性

它看起来像这个这个有点相关的线程,但仍然没有弄清楚:)

我正在尝试创建一个子类namedtuple并提供不同的初始化器,以便我可以以不同的方式构造对象.例如:

>>> from collections import namedtuple
>>> class C(namedtuple("C", "x, y")) :
...     __slots__ = ()
...     def __init__(self, obj) : # Initialize a C instance by copying values from obj
...         self.x = obj.a
...         self.y = obj.b
...     def __init__(self, x, y) : # Initialize a C instance from the parameters
...         self.x = x
...         self.y = y
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用:

>>> c = C(1, 2)
Traceback (most recent call last):
  File …
Run Code Online (Sandbox Code Playgroud)

python class namedtuple python-3.x

27
推荐指数
3
解决办法
3万
查看次数

Python语言问题:object()与Function的属性

在python中,为这样的对象实例创建新属性是非法的

>>> a = object()
>>> a.hhh = 1
Run Code Online (Sandbox Code Playgroud)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'hhh'
Run Code Online (Sandbox Code Playgroud)

但是,对于一个函数对象,它是可以的.

>>> def f():
...   return 1
...
>>> f.hhh = 1
Run Code Online (Sandbox Code Playgroud)

这种差异背后的理由是什么?

python function object

17
推荐指数
2
解决办法
1322
查看次数

可以设置Python对象的任何属性

例如,这段代码是Python:

a = object()
a.b = 3
Run Code Online (Sandbox Code Playgroud)

AttributeError: 'object' object has no attribute 'b'

但是,这段代码:

class c(object): pass
a = c()
a.b = 3
Run Code Online (Sandbox Code Playgroud)

很好.当类x没有该属性时,为什么我可以分配属性b?如何让我的类只定义属性?

python properties class object

11
推荐指数
1
解决办法
1063
查看次数

内置对象的属性分配

这有效:

class MyClass(object):
    pass

someinstance = MyClass()
someinstance.myattribute = 42
print someinstance.myattribute
>>> 42
Run Code Online (Sandbox Code Playgroud)

但这不是:

someinstance = object()
someinstance.myattribute = 42
>>> AttributeError: 'object' object has no attribute 'myattribute'
Run Code Online (Sandbox Code Playgroud)

为什么?我有一种感觉,这与对象是一个内置类有关,但我发现这不令人满意,因为我在MyClass的声明中没有改变.

python attributes initialization self

9
推荐指数
2
解决办法
2506
查看次数

哪些python类允许分配尚未存在的属性,哪些不支持?

在Python中,__dict__实例似乎对某些类是"开放的",对其他类"封闭":

# "closed" type example:
x = object()
x.eggs = 'spam'   # raises an AttributeError
Run Code Online (Sandbox Code Playgroud)

然而:

# "open" type example I:
x = Exception()
x.eggs = 'spam'   # does not raise an AttributeError

# "open" type example II: subclasses
class thing(object): pass
x = thing()
x.eggs = 'spam'   # does not raise an AttributeError
Run Code Online (Sandbox Code Playgroud)

我想了解这种行为差异的实施地点/方式/原因:为什么object关闭但是thing开放?为什么Exception开放?这个问题有两个原因:

  • 在纯Python中,我发现复制"封闭"行为的唯一方法是实现__setattr__自己并AttributeError在其中引发,手动编写适当格式的错误消息.是否有一种不那么冗长,更干的方式(以及一种不会产生潜在误导性回溯的方式__setattr__)?

  • 在我编写的IPC模块中,我想记录一个使用示例,最简洁和最通用的方法是找到一个内置的例子type(失败,一个来自标准库)(a)可以腌制并发送到另一个进程,(b)其实例表现出"开放"行为.到目前为止,我发现的最好的是Exception但在文档中看起来有点误导(人们会认为它是关于异常的).更通用的对象会更好,但是object关闭,除非将其定义保存在路径上的文件中,否则子类(thing如上例中所示)是不可能pickle …

python

9
推荐指数
0
解决办法
83
查看次数

在Python中动态创建对象

我为什么需要

class DummyObject(object):
    pass
Run Code Online (Sandbox Code Playgroud)

为了要做

dummy = DummyObject()
dummy.foo = 42
Run Code Online (Sandbox Code Playgroud)

为什么这在Python中不合法?

dummy = object()
dummy.foo = 42
Run Code Online (Sandbox Code Playgroud)

这给出了错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'foo'
Run Code Online (Sandbox Code Playgroud)

python

6
推荐指数
0
解决办法
959
查看次数

为什么我不能将任意成员添加到对象实例?

我才意识到:

class A(object): pass

a = A()
a.x = 'whatever'
Run Code Online (Sandbox Code Playgroud)

Works(不会引发错误并创建新x成员).

但是这个:

a = object()
a.x = 'whatever'
Run Code Online (Sandbox Code Playgroud)

举:

AttributeError: 'object' object has no attribute 'x'
Run Code Online (Sandbox Code Playgroud)

虽然我可能永远不会在实际生产代码中使用它,但我对于不同行为的原因有点好奇.

任何提示?

python

5
推荐指数
1
解决办法
101
查看次数

无法在 Python 3 中的 ElementTree.Element 实例上设置属性

我不明白为什么在 Python 3 中我不能向ElementTree.Element实例添加一些属性。这是区别:

在 Python 2 中:

Python 2.6.6 (r266:84292, Jun 18 2012, 14:18:47) 
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from xml.etree import ElementTree as ET
>>> el = ET.Element('table')
>>> el.foo = 50
>>> el.foo
50
>>> 
Run Code Online (Sandbox Code Playgroud)

在 Python 3 中:

Python 3.3.0 (default, Sep 11 2013, 16:29:08) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux
Type "help", "copyright", "credits" or "license" for more …
Run Code Online (Sandbox Code Playgroud)

python elementtree

5
推荐指数
1
解决办法
1557
查看次数

使用点(.) 访问字典键

我无法使用点(.)访问字典键,但是当我定义一个继承自 dict 的类时,我可以使用点(.)访问它的键。有人能解释一下吗?

所以,当我运行这段代码时:

d = {'first_key':1, 'second_key':2}
d.first_key
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

'dict' object has no attribute 'first_key'
Run Code Online (Sandbox Code Playgroud)

但是当我运行这个时:

class DotDict(dict):
    pass
d = DotDict()
d.first_key = 1
d.second_key = 2
print(d.first_key)
print(d.second_key)
Run Code Online (Sandbox Code Playgroud)

我明白了:

1
2
Run Code Online (Sandbox Code Playgroud)

python

5
推荐指数
1
解决办法
1万
查看次数

如果一个对象没有`__dict__`,它的类必须有一个`__slots__`属性吗?

来自/sf/answers/107036961/

为了支持任意属性赋值,对象需要__dict__:与对象关联的字典,其中可以存储任意属性.否则,无处可放新属性.

一个实例object没有携带__dict__- 如果确实如此,在可怕的循环依赖问题之前(因为__dict__,像大多数其他所有东西一样,继承自object;-),这会使Python中的每个对象都带有一个dict,这意味着开销当前没有或不需要dict的每个对象的许多字节(实质上,所有没有任意可分配属性的对象都没有或不需要dict).

...

当类具有__slots__特殊属性(字符串序列),那么class语句(更准确地说,默认元类type)并没有装备有该类的每个实例__dict__(有任意属性,因此的能力),只是一个有限,具有给定名称的刚性"槽"集(基本上每个可以对一些对象保持一个引用的位置).

如果一个对象没有__dict__,它的类必须有一个__slots__属性吗?

例如,object没有的实例__dict__,

>>> object().__dict__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute '__dict__'
Run Code Online (Sandbox Code Playgroud)

>>> object.__slots__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'object' has no attribute '__slots__'
Run Code Online (Sandbox Code Playgroud)

那么,为什么一个实例 …

python python-3.x

3
推荐指数
1
解决办法
1548
查看次数