-2

我需要从嵌套类访问变量。目标是使用 Marshmallow 库创建一个模式。代码如下所示:

class ParserScheme(Schema):

    class Meta:
        # Here I meed to access the value of my_variable :
        result = func(my_variable)

my_variable = 'foo'
my_parser = ParserScheme()

如果我设法将我的变量作为外部类(ParserScheme)的类属性传递,那么很容易将它放入内部类(Meta)。

class ParserScheme(Schema):
    class_attribute = my_variable
    class Meta:
        result = func(ParserScheme.class_attribute)

my_variable = 'foo'
my_parser = ParserScheme()

但是我似乎找不到动态设置类属性的方法。如果我设置一个“经典”属性(我的意思是类实例的属性,而不是类本身的属性),那么我无法从内部类访问它。

我也想过使用全局变量,但这并不能真正让我满意。还有另一种方法吗?

我对 OOP 比较陌生,我不确定我是否真的理解类属性的概念。我担心有一种简单的方法可以做到这一点,但我没有看到它,因为我专注于我认为这应该工作的方式......

4

1 回答 1

2

您的第一个示例中断,因为执行语句主体时尚my_variable未定义名称。class Meta

由于同样的原因,您的第二个示例也不起作用(在执行语句主体时尚my_variable未定义class ParserScheme),如果是这样,它在执行class Meta语句主体时仍然会中断,因为它将作为class ParserScheme语句主体的一部分执行,因此ParserScheme定义名称之前。

您在这里必须了解的是,classanddef是可执行语句,当模块首次导入当前进程时,它们(如果在模块的顶层)按顺序执行。在语句的情况下class,语句的主体首先在专用命名空间中顺序执行,然后这个命名空间被传递给元类构造函数并用于创建类对象的属性(YourClass.__dict__)。

长话短说:在class语句主体中,您不能引用当前或封闭范围中尚未定义的名称。时期。

这里明显的解决方案是my_variable在 class 语句之前定义,但我假设您希望它更加动态?如果是,您必须在函数中定义您的类:

def create_parser_class(my_variable):

    class ParserScheme(Schema):

        class Meta:
            result = func(my_variable)


    return ParserScheme


my_variable = 42
cls = create_parser_class(my_variable)
my_parser = cls()

但是我不能保证它会与 Marshmallow 一起开箱即用(甚至根本无法使用 FWIW)(我从未使用过,但可能会发生一些元类的事情)。此外,根据my_variable用途,您可能需要确保没有两次调用create_parser_class具有与参数相同的值。

最后一点:您可能在这里遇到了XY 问题- 当有人问如何做一些不明显或不寻常的事情时,有时会出现这种情况。也许你应该编辑你的帖子来解释“背后的问题”——也就是说,你实际上试图用这个“解决方案”解决的问题。

哦,是的:

我对 OOP 比较陌生,我不确定我是否真正理解类属性的概念

在 Python 中,类也是对象(它们的元类的实例,默认情况下是type对象),因此它们有自己的属性。您在语句的顶层定义的每个名称(带有赋值、def语句、class语句或语句)都成为类对象的属性(除非自定义元类在此过程中进行一些转换)。 importclass

类属性也可以从实例访问(除非被同名实例变量遮蔽),并且在所有实例之间共享。

于 2017-02-03T10:50:56.567 回答