如何使用名称中带冒号的属性

3 投票
2 回答
1395 浏览
提问于 2025-04-18 00:58

当一个对象的属性名中有冒号时,应该怎么使用这个属性呢?我遇到这种情况的代码是:

instances = nova.servers.list()
for i in instances:
        print i.id, i.OS-EXT-SRV-ATTR:hypervisor_hostname

在查看了这个链接 查找所有具有命名空间属性的元素在使用kwargs时,如何在Python的format()中转义冒号? 后,我尝试使用 attr 作为:

instances = nova.servers.list()
for i in instances:
        print i.id, i.(attr={"OS-EXT-SRV-ATTR":"hypervisor_hostname"})

但是它给出了一个错误,提示语法无效。我应该如何使用属性 OS-EXT-SRV-ATTR:hypervisor_hostname 呢?

2 个回答

0

使用 setattr(object, name, value) 可以给对象设置属性,而用 getattr(object, name[, default]) 则可以读取这些属性。

另外,你可以看看这个链接:如何通过编程设置属性?

你为什么想这么做呢?我遇到过一种情况,我需要把 AWS Cognito 用户的字段放在我自己的类里,而不是用字典。

        for attr in admin_get_user_dict['UserAttributes']:
            setattr(cognito_user, attr['Name'], attr['Value'])

在 Cognito 中,自定义属性的前缀是 custom:[你的属性名],所以就是这样了。如果你在设计自己的类时,尽量避免使用这个前缀。

2

不要使用带有这种名字的属性的对象。用字典来代替。

其实可以用一些不合法的Python名字来设置和获取属性:

Python 2.7.5+ (default, Sep 19 2013, 13:48:49) 

>>> class A():
...     pass
... 

>>> a = A()

>>> setattr(a, 'OS-EXT-SRV-ATTR:hypervisor_hostname', 'some_string')

>>> a.OS-EXT-SRV-ATTR:hypervisor_hostname
  File "<ipython-input-5-849986a021bc>", line 1
    a.OS-EXT-SRV-ATTR:hypervisor_hostname
                     ^
SyntaxError: invalid syntax


>>> getattr(a, 'OS-EXT-SRV-ATTR:hypervisor_hostname')
>>> 'some_string'

>>> 

但是别这么做,应该用字典来存储这些信息,而不是用对象的属性。

撰写回答