您可以使用模块级别__getattr__
(参见PEP-562)来实现这一点.这将需要重命名您的类,或者将它们放置在命名空间或单独的模块中,以确保__getattr__
被调用.
x.py个
class Namespace:
class A:
...
class B:
...
def __getattr__(name):
cls = getattr(Namespace, name)
if cls is not None:
print(f"Imported class {cls.__name__}")
return cls
raise AttributeError(f"{name} invalid")
>>> from x import A
Imported class A
从技术上讲,类中的所有代码都是when it's defined执行的,但您可以将代码放在函数中,并将其作为getattr
函数的一部分执行.或者,您可以将类定义保存为字符串,并使用exec
计算getattr
函数中的字符串.
class_C = """
class C:
print("Creating class C")
"""
def __getattr__(name):
CLASS_DEFS = {"C": class_C}
if name in CLASS_DEFS:
exec(CLASS_DEFS[name], globals())
return globals()[name]
raise AttributeError(f"{name} invalid")
>>> from x import C
Creating class C