为什么我的变量名在 Python 动态创建的类中不可见?

问题描述 投票:0回答:1

我正在尝试创建一个函数,该函数可以动态生成一个具有指定的 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 变量在类定义中不可见并建议如何解决这个问题吗?

python-3.x nameerror class-variables dynamictype
1个回答
0
投票

类体在函数运行之前执行。因此

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)
© www.soinside.com 2019 - 2024. All rights reserved.