我正在尝试创建一个函数,该函数可以动态生成一个具有指定的 mixin 和属性集的类。这是我的代码的简化版本:
def post_type_factory(name, singular_name, mixins, **kwargs):
# Dynamically create a class with the specified mixins
class PostType(*mixins):
name = name
def __init__(self, *args, **kwargs):
for amixin in mixins:
amixin.__init__(*args, **kwargs)
return PostType
但是,当我运行此代码时,出现错误:NameError:名称“名称”未定义。 我希望 PostType 从 mixins 中指定的类继承,并将 name 属性设置为传递给 post_type_factory 的 name 参数。
任何人都可以解释为什么 name 变量在类定义中不可见并建议如何解决这个问题吗?
类体在函数运行之前执行。因此
name
不在类主体的范围内。有关更多详细信息,请参阅此处:https://docs.python.org/3/tutorial/classes.html#class-definition-syntax
修复如下:
def post_type_factory(name, singular_name, mixins, **kwargs):
# Dynamically create a class with the specified mixins
class PostType(*mixins):
def __init__(self, *args, **kwargs):
for amixin in mixins:
amixin.__init__(*args, **kwargs)
self.name = name
return PostType(**kwargs)
关于继承的说明:
调用
__init__
函数时,您不应忘记提供 self
。
因此:
def post_type_factory(name, singular_name, mixins, **kwargs):
# Dynamically create a class with the specified mixins
class PostType(*mixins):
def __init__(self, *args, **kwargs):
for amixin in mixins:
amixin.__init__(self, *args, **kwargs)
self.name = name
return PostType(**kwargs)
更重要的是,使用
super()
,你可以自动调用所有mixin构造函数。
因此:
def post_type_factory(name, singular_name, mixins, **kwargs):
# Dynamically create a class with the specified mixins
class PostType(*mixins):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.name = name
return PostType(**kwargs)