gpt4 book ai didi

python - 在使用 `types.new_class` 创建的类上设置模块

转载 作者:行者123 更新时间:2023-12-01 06:41:59 25 4
gpt4 key购买 nike

我正在使用 types.new_class 动态创建类。到目前为止一切都很顺利。唯一不方便的是该类创建的模块是abc ,至少当abc.ABCMeta时参与。考虑以下人为的示例:

import abc
import types

class Base(metaclass=abc.ABCMeta):
@abc.abstractmethod
def method(self, x):
pass

def generate_a_class(name):
def method(self, x):
print(f"Method recieved {x}")

class_body = {method.__name__: method}
NewClass = types.new_class(
name, bases=(Base,), exec_body=lambda ns: ns.update(class_body))

return NewClass

然后我们打印该方法生成的类:

print(generate_a_class("Implementation"))
# Prints <class 'abc.Implementation'>

有没有办法在代码运行的模块中定义类?那将是 <class '__main__.Implementation'>在这个例子中。

最佳答案

来自Davis Herring的评论这就是我所需要的;直接在类主体中分配模块。代码如下所示:

import abc
import types
import sys

class Base(metaclass=abc.ABCMeta):
@abc.abstractmethod
def method(self, x):
pass

def generate_a_class(name, module:str = None):
def method(self, x):
print(f"Method recieved {x}")

class_body = {
"__module__": __name__ if module is None else module,
method.__name__: method,
}
NewClass = types.new_class(
name, bases=(Base,), exec_body=lambda ns: ns.update(class_body))

return NewClass

并且该类与正确的模块关联。

print(generate_a_class("Implementation"))
# Prints <class '__main__.Implementation'>

关于python - 在使用 `types.new_class` 创建的类上设置模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59412427/

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