我需要从嵌套类中访问变量。目标是使用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属性的概念。我担心有一个简单的方法可以做到这一点,但我没有看到它,因为我专注于我认为这应该工作的方式......
答案 0 :(得分:2)
您的第一个示例中断,因为在执行my_variable
语句正文时尚未定义名称class Meta
。
你的第二个例子由于同样的原因(my_variable
语句的主体执行时尚未定义class ParserScheme
)而无法工作,如果是的话执行class Meta
语句正文时仍然会中断,因为它将作为class ParserScheme
语句正文的一部分执行,因此之前名称{{1已定义。
这里你必须要了解的是ParserScheme
和class
是可执行语句,当模块首次导入当前进程时,它们(如果在模块的顶层)顺序执行。在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实例变量遮蔽),并在所有实例之间共享。