如何在使用静态 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)
我有一个问题,我试图在 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)