python类变量在__init__中不可见?

时间:2009-07-01 21:25:34

标签: python

此代码会生成错误消息,我发现这一消息令人惊讶:

class Foo(object):
    custom = 1
    def __init__(self, custom=Foo.custom):
        self._custom = custom

x = Foo()

任何人都可以提供启发吗?

4 个答案:

答案 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