如何在使用静态 class 变量的 class 的 __init__ 中定义默认参数?

How to define a default argument in __init__ of a class that uses a static class variable?

我有一个问题,我试图在 class:

的 init 中使用静态变量作为必需的命名默认参数
class Foo:
    bar = 1
    rab = 2
    
    def __init__(self, /, def_arg=Foo.bar):
        if def_arg == self.bar:
            pass
        elif def_arg == self.rab:
            pass

Foo()
Foo(Foo.rab)

4: NameError: name 'Foo' is not defined

我也尝试过不使用 Foo.,也尝试过 self.,但它不起作用。它必须是特别静态的,所以我不想使用 self.bar。这完全可能吗?

我想如果你用 @classmethod 装饰器创建了另一个函数,你可以像这样使用静态变量:

class Foo:
   bar = 1

   def __init__(self):
       print(self.func())
   @classmethod
   def func(cls):
       return cls.bar

bar 仍然是一个静态变量

如果你只使用 bar 就可以了。

def __init__(self, def_arg=bar):
    print(def_arg)

你可能会这样做...

class Foo:
    bar = 1

    def __init__(self, def_arg=bar):
        self.def_arg = def_arg

    def __repr__(self):
        return "{self.def_arg}".format(self=self)

foo = Foo()
print(foo) # should print 1

默认关键字分配是在编译方法时进行的。这发生在 class 被分配给 Foo 之前,因此 Foo.bar 还不存在。但是此时 bar 确实存在于封闭的命名空间中。 def_arg=bar 将获取 bar 中的当前对象并将其设为 __init__ 的默认参数。请注意,一旦设置了默认参数,就无法更改。如果 Foo.bar 被重新分配,这不会影响已经放置在函数对象中的默认值 __init__.

class Foo:
    bar = 1
    rab = 2
    
    def __init__(self, def_arg=bar):
        if def_arg == self.bar:
            pass
        elif def_arg == self.rab:
            pass

Foo()
Foo(Foo.rab)