如何通过特定导入在类中执行Python代码

1 投票
1 回答
47 浏览
提问于 2025-04-14 17:32

我想知道怎么导入一个特定的类,并在导入时执行里面的代码。

假设我有一个文件叫做 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 

撰写回答