如何从Python中的变量定义类属性?

时间:2017-02-03 10:10:58

标签: python python-3.x marshmallow

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

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()

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

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

我对OOP很新,我不确定我是否理解了class属性的概念。我担心有一个简单的方法可以做到这一点,但我没有看到它,因为我专注于我认为这应该工作的方式......

1 个答案:

答案 0 :(得分:2)

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

你的第二个例子由于同样的原因(my_variable语句的主体执行时尚未定义class ParserScheme)而无法工作,如果是的话执行class Meta语句正文时仍然会中断,因为它将作为class ParserScheme语句正文的一部分执行,因此之前名称{{1已定义。

这里你必须要了解的是ParserSchemeclass是可执行语句,当模块首次导入当前进程时,它们(如果在模块的顶层)顺序执行。在def语句的情况下,语句的主体首先在专用命名空间中顺序执行,然后将此命名空间传递给元类构造函数并用于创建类对象的属性({ {1}})。

简而言之:在class语句体中,您只是不能引用当前或封闭范围中尚未定义的名称。期。

这里显而易见的解决方案是在类声明之前定义YourClass.__dict__,但我认为你希望它更具动态性?如果是,您必须在函数中定义您的类:

class

但我不能保证它能与Marshmallow开箱即用(甚至不用于所有FWIW)(我从未使用但可能会发生一些元类事件)。另外,根据my_variable的使用情况,您可能需要确保没有两个与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() 的调用具有与参数相同的值。

作为最后一点:你可能在这里有一个XY problem - 当有人询问如何做一些不明显或不寻常的事情时,有时会这样。也许你应该编辑你的帖子来解释"背后的问题" - 也就是说,你实际上试图用这个"解决方案解决的问题"。

哦,是的:

  

我对OOP很新,而且我不确定我是否理解了类属性的概念

在Python中,类也是对象(它们的元类的实例,默认为my_variable对象),因此它们有自己的属性。您在create_parser_class语句顶层定义的每个名称(带有赋值,type语句,def语句或class语句)都属于类对象(除非自定义元类在路上进行一些转换,即)。

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