我有一个嵌套得很深的对象,最近我发现人们正在执行__qualname__
来获取嵌套对象的路径,但是我的对象似乎缺少了这两个神奇的函数。我目前正在使用Python3.6。
对象类
class node:
def __init__(self, dict1):
self.__dict__.update(dict1)
函数将字典转换为嵌套对象:
def dict2obj(dict1):
return json.loads(json.dumps(dict1), object_hook=node)
将json加载到字典并将其转换为:
abc = dict2obj(json.load(open("example.json")))
整个过程将JSON文件转换为嵌套对象,因此我可以在对象中导航,比如abc.foo.bar
,我希望执行返回'bar'
的abc.foo.bar.__name__
和返回'abc.foo.bar'
的abc.foo.bar.__qualname__
,但这两个神奇的函数似乎都缺失了。
发布于 2021-11-29 08:13:44
在python中永远不会有这样的函数。定义类或函数时,__name__
设置为函数的名称:
class A:
pass
A.__name__
# prints "A"
class
关键字设置此变量,它不是函数,如果将A赋值给另一个变量,则不会在以后设置:
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
print __name__
b.py
import a
这将打印a
。
如果您在a.py
中定义了一个类,那么__qualname__
将是全局模块级变量__name__
,它与类拥有的__name__
连接在一起。
a.py
class A:
pass
print(A.__qualname__)
b.py
import a
这将打印a.A
为什么这样的变量不可能存在?
任何对象都可以有多个引用。要用哪个名字?假设存在一个函数get_full_path
,它可以做您想做的事情。
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]
?它们都是同样有效的,两者之间没有区别。
https://stackoverflow.com/questions/70151286
复制相似问题