繁体   English   中英

如何获得 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM