[英]AttributeError when using object.__setattr__
What's wrong with the last three lines? 最后三行怎么了?
class FooClass(object):
pass
bar1 = object()
bar2 = object()
bar3 = object()
foo1 = FooClass()
foo2 = FooClass()
foo3 = FooClass()
object.__setattr__(foo1,'attribute','Hi')
foo2.__setattr__('attribute','Hi')
foo3.attribute = 'Hi'
object.__setattr__(bar1,'attribute','Hi')
bar2.attribute = 'Hi'
bar3.attribute = 'Hi'
I need an object having a single attribute (like foo) should I define a class (like FooClass) just for it? 我需要一个具有单个属性的对象(例如foo),是否应该为此定义一个类(例如FooClass)?
object
is built-in type , so you can't override attributes and methods of its instances. object
是内置类型 ,因此您不能覆盖其实例的属性和方法。
Maybe you just want a dictionary
or collections.NamedTuples
: 也许您只想要一
dictionary
或collections.NamedTuples
:
>>> d = dict(foo=42)
{'foo': 42}
>>> d["foo"]
42
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'], verbose=True)
>>> p = Point(11, y=22) # instantiate with positional or keyword arguments
>>> p[0] + p[1] # indexable like the plain tuple (11, 22) 33
>>> x, y = p # unpack like a regular tuple
>>> x, y (11, 22)
>>> p.x + p.y # fields also accessible by name 33
>>> p # readable __repr__ with a name=value style Point(x=11, y=22)
You cannot add new attributes to an object()
, only to subclasses. 您不能将新属性添加到
object()
,而只能添加到子类。
Try collections.NamedTuple
s. 尝试
collections.NamedTuple
。
Besides, instead of object.__setattr__(foo1,'attribute','Hi')
, setattr(foo1, 'attribute', 'Hi')
would be better. 此外,代替
object.__setattr__(foo1,'attribute','Hi')
, setattr(foo1, 'attribute', 'Hi')
会更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.