首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对象中缺少的__name__和__qualname__

对象中缺少的__name__和__qualname__
EN

Stack Overflow用户
提问于 2021-11-29 07:53:11
回答 1查看 150关注 0票数 0

我有一个嵌套得很深的对象,最近我发现人们正在执行__qualname__来获取嵌套对象的路径,但是我的对象似乎缺少了这两个神奇的函数。我目前正在使用Python3.6。

对象类

代码语言:javascript
运行
复制
class node:
    def __init__(self, dict1):
        self.__dict__.update(dict1)

函数将字典转换为嵌套对象:

代码语言:javascript
运行
复制
def dict2obj(dict1):
    return json.loads(json.dumps(dict1), object_hook=node)

将json加载到字典并将其转换为:

代码语言:javascript
运行
复制
abc = dict2obj(json.load(open("example.json")))

整个过程将JSON文件转换为嵌套对象,因此我可以在对象中导航,比如abc.foo.bar,我希望执行返回'bar'abc.foo.bar.__name__和返回'abc.foo.bar'abc.foo.bar.__qualname__,但这两个神奇的函数似乎都缺失了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-29 08:13:44

在python中永远不会有这样的函数。定义类或函数时,__name__设置为函数的名称:

代码语言:javascript
运行
复制
class A:
    pass

A.__name__
# prints "A"

class关键字设置此变量,它不是函数,如果将A赋值给另一个变量,则不会在以后设置:

代码语言:javascript
运行
复制
class A:
    pass
B = A
B.__name__
# Still prints "A", since only the class keyword sets name, not reassignment

夸尔名

模块对象还具有导入设置的__name__,这就是为什么您看到if __name__ == "__main__"用于可执行的python脚本,以确保它们在导入时不会被执行。

如果你有这样的文件:

a.py

代码语言:javascript
运行
复制
print __name__

b.py

代码语言:javascript
运行
复制
import a

这将打印a

如果您在a.py中定义了一个类,那么__qualname__将是全局模块级变量__name__,它与类拥有的__name__连接在一起。

a.py

代码语言:javascript
运行
复制
class A:
    pass
print(A.__qualname__)

b.py

代码语言:javascript
运行
复制
import a

这将打印a.A

为什么这样的变量不可能存在?

任何对象都可以有多个引用。要用哪个名字?假设存在一个函数get_full_path,它可以做您想做的事情。

代码语言:javascript
运行
复制
def k(m):
    print(get_full_path(m.four[2])) # no such function exists
a = db.users["bob"].name_field
b.all_names = a.names
k(b.all_names[5])

这个应该印什么?m.four[2]db.users["bob"].name_field.names.four[2]还是b.all_names.four[2]?它们都是同样有效的,两者之间没有区别。

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

https://stackoverflow.com/questions/70151286

复制
相关文章

相似问题

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