此代码会生成错误消息,我发现这一消息令人惊讶:
class Foo(object):
custom = 1
def __init__(self, custom=Foo.custom):
self._custom = custom
x = Foo()
任何人都可以提供启发吗?
答案 0 :(得分:11)
Foo
不可见,因为你正在构建它。但由于您与custom
的范围相同,因此您可以说custom
而不是Foo.custom
:
class Foo(object):
custom = 1
def __init__(self, mycustom=custom):
self._custom = mycustom
但请注意,稍后更改Foo.custom
不会影响随后创建custom
的{{1}}的值:
Foo
通过使用哨兵默认值,您可以获得所需内容:
class Foo(object):
custom = 1
def __init__(self, mycustom=custom):
self._custom = mycustom
one = Foo()
Foo.custom = 2
two = Foo()
print (two._custom) # Prints 1
答案 1 :(得分:6)
我们做的是以下
class Foo( object ):
custom = 1
def __init__( self, arg=None )
self._custom = self.custom if arg is None else arg
这绕过了名称Foo
是否已定义的令人困惑的问题。
答案 2 :(得分:3)
类主体在类定义之前执行,因此默认参数值不能引用类。只需使custom
默认(没有类别限定)就可以了。
答案 3 :(得分:2)
我收到以下错误:
Traceback (most recent call last):
Line 1, in <module>
class Foo(object):
Line 3, in Foo
def __init__(self, custom=Foo.custom):
NameError: name 'Foo' is not defined
这是因为名称Foo
正在定义为__init__
函数已定义,并且当时尚未完全可用。
解决方案是避免在函数定义中使用名称Foo
(我还将custom
参数重命名为acustom
以区别于Foo.custom
):
class Foo(object):
custom = 1
def __init__(self, acustom=custom):
self._custom = acustom
x = Foo()
print x._custom