python类方法是否可以将在init(self)中更新的同一类变量作为参数?

2024-09-28 03:22:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个python类

class A:
"""
This is a class retaining some constants
"""
    C=1

class B:
     VAR = None
     def __init__(self):
         b.VAR = A
     def f(self, v=VAR ):
         print(v.C)

clb = B()
clb .f()

AttributeError: 'NoneType' object has no attribute 'C'

所以我要做的是用类A的引用填充B::init()中的B::VAR类变量,然后在B::f()中使用默认参数v(保留VAR)访问A::C。 我打算使用v作为B::f()中代码的默认值,如果需要在调用函数时对其进行更改。 我的设想可能吗

谢谢,


Tags: selfnoneinitisvardefsomethis
2条回答

是的,这是可能的:

class A:
    """
    This is a class retaining some constants
    """
    C = 1


class B:
    VAR = None

    def __init__(self):
        self.VAR = A

    def f(self, v=None):
        if v is None:
            v = self.VAR
        print(v.C)


clb = B()
clb.f()

问题是默认参数v=VAR是对B.VAR的旧引用,它是None,而不是对象clb.VAR的更新值

memory diagram

此图显示f()的旧版本有一个指向None的默认值v,因为这是在定义类B时,在创建clb:B对象之前,在方法定义时计算的,其中VAR是类属性。 我的建议是在运行时通过self使用对象的变量设置v,该变量在__init__中更改为A

class A:
    C = 1


class B:
    VAR = None

    def __init__(self):
        B.VAR = A

    @classmethod
    def f(cls):
        print(cls.VAR.C)


clb = B()
clb.f()

这是另一种方法。然而,我想知道你到底想做什么,因为这看起来真的很奇怪

相关问题 更多 >

    热门问题