首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3:访问dunder变量

Python3:访问dunder变量
EN

Stack Overflow用户
提问于 2019-10-29 10:50:44
回答 1查看 661关注 0票数 1

我知道PythonDunder变量是什么,并且我知道名称mangling。

但是,由于某些原因,我无法在下面的代码片段中访问But变量:

代码语言:javascript
复制
    for node in ast.find_all((Call,)):
        # Check if the identifier match the extension name
        if node.node.identifier == 'myapp.ext.MyExtension':
            # I want to access node.__meta
            print("==> type(node) = %s" % type(nod))
            print("==> node.__dict__ = %s" % node.__dict__")

其中的指纹:

代码语言:javascript
复制
==> type(node) = <class 'jinja2.nodes.Call'>
==> node.__dict__ = {
        'kwargs': [],
        # ... a bunch of other attributes
        # The __meta attribute below is what I want to access
        '__meta': {'type': 'checkbox', 'value': Const(value='checked'), 'name': Const(value='agree'), 'class': Const(value='bold')}
    }

由于node变量是Call类的一个实例,并且我希望访问它的__meta属性,根据名称mangling,我必须像这样做node._Call__meta,但是我得到了一个错误:

代码语言:javascript
复制
`'Call' object has no attribute '_Call__meta'`

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-29 11:04:16

您似乎对名称损坏和__dict__之间的交互方式略有误解。__dict__条目不受名称mangling的限制--如果您在__dict__中看到名称'__meta',那么该属性实际上是命名为__meta (而不是_Call__meta)。

你可以通过这个小小的演示来证实这一点:

代码语言:javascript
复制
class Demo:
    __meta = 5

print('__meta' in vars(Demo))  # False
print('_Demo__meta' in vars(Demo))  # True

有两种方法可以访问这个__meta属性:

如果您的代码不在类中,则可以使用

  1. 。这在类中不起作用,因为这样name-mangled.
  2. Alternatively,就可以从node.__dict__['__meta'].

__dict__中直接获取属性

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58605984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档