![](/img/trans.png)
[英]do I understand the difference between instance attributes and class attributes in Python?
[英]How do I get a dict of Python class attributes (not an instance)?
我想访问类中的属性,以便我可以动态更改它们。
我在这个网站上看到的答案表明类的__dict__
会提供这个,因为我尝试过这个代码:
class Item:
def __init__(self):
self.name = ''
self.description = ''
self.weight = ''
self.volume = ''
print(Item.__dict__)
{'__module__': '__main__', '__init__': <function Item.__init__ at 0x0000026F3F5988C8>, '__dict__': <attribute '__dict__' of 'Item' objects>, '__weakref__': <attribute '__weakref__' of 'Item' objects>, '__doc__': None}
似乎我想访问Item.__dict__.['__dict__']
但我不知道该怎么做。
正如其他人指出的那样,为了查看实例属性(而不是类属性),您必须实例化该类型的对象。 然而,与其使用__dict__
属性,不如使用内置的vars
函数。
item = Item()
items_attrs = vars(item)
这在幕后做同样的事情,但看起来更像 Pythonic。
您还可以在类上定义__slots__
属性。 这将以一种可能不需要的方式改变类(及其对象)的行为,但允许您轻松访问您感兴趣的信息。值得注意的是,这种行为发生了变化:
如果没有
__dict__
变量,则不能为实例分配__slots__
定义中未列出的新变量。 尝试分配给未列出的变量名称会引发AttributeError
。 如果需要动态分配新变量,则将'__dict__'
添加到__slots__
声明中的字符串序列。
class Item(object):
__slots__ = ['name',
'description',
'weight',
'volume']
def __init__(self):
self.name = ''
self.description = ''
self.weight = ''
self.volume = ''
Item_attrs = Item.__slots__
item = Item()
item_attrs = item.__slots__
assert item_attrs == Item_attrs
您可能会混淆类变量和实例变量。 在您的代码的以下修改中, classvar
是一个类变量:
class Item:
classvar = 'foo'
def __init__(self):
self.name = ''
self.description = ''
self.weight = ''
self.volume = ''
现在Item.__dict__
将包含classvar
。 但是在类被实例化之前不会创建实例变量:
i1 = Item()
print(i1.__dict__()) # will contain 'name', 'description' etc.
但是,您为什么要玩__dict__
? 只有一些代码自省技巧才需要它。 您可以简单地通过点表示法访问类和实例变量:
print(Item.classvar)
i1 = Item()
print(i1.name)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.