如何导入特定的类并通过导入来执行其中的代码?

假设我有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!
>>>

目前,使用相同的条件执行相同的命令会导致打印两个字符串.

我怎样才能做到这一点呢?

推荐答案

您可以使用模块级别__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 

Python相关问答推荐

如何使用Google Gemini API为单个提示生成多个响应?

由于NEP 50,向uint 8添加-256的代码是否会在numpy 2中失败?

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

如何在Python中并行化以下搜索?

如何获取numpy数组的特定索引值?

Pandas计数符合某些条件的特定列的数量

如何在Polars中从列表中的所有 struct 中 Select 字段?

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

SQLAlchemy bindparam在mssql上失败(但在mysql上工作)

Tkinter菜单自发添加额外项目

Polars将相同的自定义函数应用于组中的多个列,

如何将数据帧中的timedelta转换为datetime

在numpy数组中寻找楼梯状 struct

如何过滤组s最大和最小行使用`transform`'

Python类型提示:对于一个可以迭代的变量,我应该使用什么?

numpy数组和数组标量之间的不同行为

如何编辑此代码,使其从多个EXCEL文件的特定工作表中提取数据以显示在单独的文件中

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?

仅取消堆叠最后三列

普洛特利express 发布的人口普查数据失败