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



我需要访问嵌套类中的变量。目标是使用棉花糖库创建一个模式。代码如下:

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之前

这里您必须理解的是,classdef是可执行语句,当模块首次导入当前进程时,它们(如果位于模块的顶层)将按顺序执行。在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语句)都将成为类对象的属性(除非自定义元类正在进行一些转换)。

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

相关内容

  • 没有找到相关文章

最新更新