如何通过特定导入在类中执行Python代码
我想知道怎么导入一个特定的类,并在导入时执行里面的代码。
假设我有一个文件叫做 x.py
:
class classY:
print('Executed class Y!')
class classZ:
print('Executed class Z!')
我希望当我从另一个文件只导入这个模块时,能执行这行代码 print('Executed function Y!')
。
举个例子,当我执行命令 from x import classY
时,我希望控制台的输出是:
>>>from x import classY
Executed class Y!
>>>
目前,执行相同的命令和条件时,会打印出两个字符串。
我该怎么做才能实现这个效果呢?
1 个回答
1
你可以尝试使用模块级别的 __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
从技术上讲,类里面的所有代码是在定义的时候就执行的,但你可以把代码放在函数里,这样它就可以在 getattr
函数执行的时候运行。另一种方法是把类的定义保存为字符串,然后在 getattr
函数里用 exec
来执行这些字符串。
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