![](/img/trans.png)
[英]how can I define python class with list attribute and the class constructor that accept variable arguments?
[英]How can I define a class attribute from a variable in Python?
我需要从嵌套类访问变量。 目标是使用 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 比较陌生,我不确定我是否真的理解类属性的概念。 我担心有一种简单的方法可以做到这一点,但我并没有像我那样专注于我认为这应该起作用的方式......
您的第一个示例中断,因为在执行class Meta
语句的主体my_variable
未定义名称my_variable
。
你第二个例子不会为同样的原因无论是工作( my_variable
的时候没有定义class ParserScheme
执行语句的身体),如果是执行时,它仍然会打破class Meta
语句的身体,因为它会作为一部分来执行class ParserScheme
语句的主体,因此在名称ParserScheme
被定义之前。
这里你必须理解的是, class
和def
是可执行语句,当模块第一次导入当前进程时,它们(如果在模块的顶层)按顺序执行。 在class
语句的情况下,语句的主体首先在专用命名空间中顺序执行,然后将此命名空间传递给元类构造函数并用于创建类对象的属性 ( YourClass.__dict__
)。
长话短说:在class
语句主体中,您不能引用尚未在当前或封闭范围内定义的名称。 时期。
这里显而易见的解决方案是在 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()
但是我不能保证它可以与 Marshmallow 一起使用(我从未使用过,但可能会发生一些元类的事情)。 此外,根据my_variable
的用途,您可能需要确保没有两次调用create_parser_class
的值与参数相同。
最后一点:您可能在这里遇到了XY 问题-有时当有人问如何做一些不明显或不寻常的事情时就是这种情况。 也许你应该编辑你的帖子来解释“背后的问题”——也就是说,你实际上试图用这个“解决方案”解决的问题。
哦,是的:
我对 OOP 很陌生,我不确定我是否真的理解类属性的概念
在 Python 中,类也是对象(它们的元类的实例,默认情况下是type
对象),因此它们有自己的属性。 定义(与分配,一个每名def
语句,一class
的语句或import
语句)在的顶级class
除非有自定义元类,使在路上一些转换语句变成类对象的属性(即是)。
类属性也可以从实例访问(除非被同名实例变量隐藏),并且在所有实例之间共享。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.