gpt4 book ai didi

Python:如何访问外部类命名空间

转载 作者:太空宇宙 更新时间:2023-11-03 11:23:36 25 4
gpt4 key购买 nike

考虑这段代码:

class A:
B = 42 # or whatever
class C:
a = B # wont find `B` here

那是行不通的,因为在 C 类 中,它找不到 B

您也不能使用 A.B,因为此时 A 还未知,因为它仍在构造中,因此它不在全局命名空间中。在成员函数中,这会起作用,因为在您执行该代码时,全局名称 A 可能已注册。但是,我明确要求直接访问,而不是在成员函数内。

那么,在这种嵌套类构造中是否还有其他方法可以访问外部命名空间?

我想答案可能是否定的,或者至少不是以一种干净的方式。我在 class C 中添加了一个 print(locals()) 并且使用 Python 2,我得到了 {'__module__': '__main__'} ,使用 Python 3,我得到 {'__qualname__': 'A.C', '__module__': '__main__'}。因此无论是局部变量还是全局变量都不会给我访问父本地 namespace 的权限。

关于一种不干净的方法:sys._getframe(1).f_locals["B"] 会起作用。那是 A 类正在构建时的局部变量,B 就在其中。

那么,如果没有干净的方法来做到这一点,还有哪些其他解决方案?我可以直接在全局命名空间中声明所有类,但我不喜欢那样(对于我的特定用例)。我可以将它们移动到一个子模块中并将它们导入到 A 中。但这会使代码更难阅读。还有其他解决方案吗?


所以,我想它总是一样的,除非我不展示一个真实世界的例子,否则人们不会相信这样的用例是如何发生的。所以,这里是 ( via ):

class structs:
# .... many more

class _anonymous_label(ctypes.Structure):
_fields_ = [
('lb_type', ctypes.c_int),
('lb_str', ctypes.POINTER(ctypes.c_byte))]

class _anonymous_labellist(ctypes.Structure):
_fields_ = [
('ll_nlabels', ctypes.c_int),
('ll_label', ctypes.POINTER(_anonymous_label))] # error

# .... many more

最佳答案

class Constants:
a = 1

class A:
class B(Constants):
pass

class C(Constants):
pass

print(A.B.a, A.C.a)

关于Python:如何访问外部类命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38126674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com