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

2024-09-27 21:33:17 发布

您现在位置: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()

如果我设法将变量作为外部类(ParserScheme)的类属性传递,那么就很容易将其放入内部类(Meta)。在

^{pr2}$

但是我似乎找不到一种动态设置类属性的方法。如果我设置了一个“经典”属性(我指的是类实例的属性,而不是类本身的属性),那么我就不能从内部类访问它。在

我也想过使用全局变量,但这并不能真正满足我。有别的办法吗?在

我对OOP比较陌生,我不太清楚类属性的概念。我担心有一个简单的方法来做到这一点,但我并没有看到我应该集中在我认为这应该工作的方式。。。在


Tags: 方法代码目标属性hereschemamy模式
1条回答
网友
1楼 · 发布于 2024-09-27 21:33:17

第一个示例中断是因为在执行class Meta语句的主体时尚未定义名称my_variable。在

第二个例子也不能工作,因为同样的原因(my_variable在执行class ParserScheme语句时还没有定义),如果是这样的话,在执行class Meta语句体时它仍然会中断,因为它将作为class ParserScheme语句体的一部分执行,因此在定义名称ParserScheme之前,。在

这里您需要理解的是,class和{}是可执行语句,当模块第一次导入当前进程时,它们(如果在模块的顶层)是按顺序执行的。在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()

但我不能保证它会在包装盒外工作(甚至根本不工作FWIW)和棉花糖(我从来没有用过,但可能有一些元类的东西发生)。另外,取决于my_variable的用途,您可能需要确保没有两个对create_parser_class的调用具有相同的参数值。在

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

哦,是的:

I am rather new to OOP, and I am not sure I understand really well the concept of class attribute

在Python中,类也是对象(它们的元类的实例,默认情况下是type对象),因此它们有自己的属性。在class语句的顶层定义的每个名称(使用赋值、def语句、class语句或import语句)都将成为类对象的属性(除非自定义元类在此过程中进行了一些转换)。在

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

相关问题 更多 >

    热门问题