我需要访问嵌套类中的变量。目标是使用棉花糖库创建一个模式。代码如下:
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()
如果我设法将变量作为外部类(ParserSchema)的类属性传递,那么很容易将其传递到内部类(Meta)中。
class ParserScheme(Schema):
class_attribute = my_variable
class Meta:
result = func(ParserScheme.class_attribute)
my_variable = 'foo'
my_parser = ParserScheme()
然而,我似乎找不到动态设置类属性的方法。如果我设置了一个"classic"属性(我指的是类实例的属性,而不是类本身的属性),那么我就不能从内部类访问它。
我也想过使用全局变量,但这并不能真正让我满意。有其他方法吗?
我是OOP的新手,我不确定我是否真正理解类属性的概念。我担心有一种简单的方法可以做到这一点,但我并不认为我应该专注于我认为的工作方式。。。
您的第一个示例中断了,因为在执行class Meta
语句体时尚未定义名称my_variable
。
由于同样的原因,第二个示例也不起作用(执行class ParserScheme
语句体时尚未定义my_variable
),如果是,则在执行class Meta
语句体时仍然会中断,因为它将作为class ParserScheme
语句体的一部分执行,因此在定义名称ParserScheme
之前。
这里您必须理解的是,class
和def
是可执行语句,当模块首次导入当前进程时,它们(如果位于模块的顶层)将按顺序执行。在class
语句的情况下,语句的主体首先在专用命名空间中顺序执行,然后将此命名空间传递给元类构造函数,并用于创建类对象的属性(YourClass.__dict__
)。
长话短说:在class
语句体中,您只是不能引用尚未在当前或封闭范围中定义的名称。时期
这里显而易见的解决方案是在类语句之前定义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()
但我不能保证它会开箱即用(甚至FWIW也不起作用)与棉花糖(我从未使用过,但可能有一些元类的东西发生)。另外,根据my_variable
的用途,您可能需要确保没有两个对create_parser_class
的调用与参数的值相同。
最后一点:你可能有XY问题——当有人问如何做一些不明显或不寻常的事情时,有时会出现这种情况。也许你应该编辑你的帖子来解释"背后的问题"——也就是说,你实际上试图用这个"解决方案"来解决的问题。
哦,是的:
我对OOP相当陌生,我不确定我是否真的很好地理解类属性的概念
在Python中,类也是对象(其元类的实例,默认为type
对象),因此它们有自己的属性。在class
语句的顶层定义的每个名称(通过赋值、def
语句、class
语句或import
语句)都将成为类对象的属性(除非自定义元类正在进行一些转换)。
类属性也可以从实例访问(除非被同名实例变量遮蔽),并且在所有实例之间共享。