python类属性不能用作构造函数的参数?

python类属性不能用作构造函数的参数?,python,class,constructor,arguments,class-attributes,Python,Class,Constructor,Arguments,Class Attributes,在python 3中,我发现class属性可以用作\uuuu init\uuuu()函数中的参数,如下所示: 文件test.py: class Foo: var1 = 23333 def __init__(self, var=var1): self.var = var 在cmd中运行: C:\Users\rikka\Desktop>py -3 -i test.py >>> f1=Foo() >>> f1.var 2333

在python 3中,我发现class属性可以用作
\uuuu init\uuuu()
函数中的参数,如下所示:

文件test.py:

class Foo:
    var1 = 23333
    def __init__(self, var=var1):
        self.var = var
在cmd中运行:

C:\Users\rikka\Desktop>py -3 -i test.py
>>> f1=Foo()
>>> f1.var
23333
C:\Users\rikka\Desktop>py -3 -i test2.py
Traceback (most recent call last):
  File "test2.py", line 1, in <module>
    class Foo:
  File "test2.py", line 3, in Foo
    def __init__(self, var=Foo.var1):
NameError: name 'Foo' is not defined
但通过使用点表达式,当初始化此类时,解释器将报告错误:

文件test2.py:

class Foo:
    var1 = 23333
    def __init__(self, var=Foo.var1):
       self.var = var
在cmd中运行:

C:\Users\rikka\Desktop>py -3 -i test.py
>>> f1=Foo()
>>> f1.var
23333
C:\Users\rikka\Desktop>py -3 -i test2.py
Traceback (most recent call last):
  File "test2.py", line 1, in <module>
    class Foo:
  File "test2.py", line 3, in Foo
    def __init__(self, var=Foo.var1):
NameError: name 'Foo' is not defined
C:\Users\rikka\Desktop>py-3-ites2.py
回溯(最近一次呼叫最后一次):
文件“test2.py”,第1行,在
Foo类:
文件“test2.py”,第3行,在Foo中
定义初始化(self,var=Foo.var1):
NameError:未定义名称“Foo”

我只是不知道为什么解释器找不到名称“Foo”,因为Foo是环境中全局框架中的一个名称。关于python类,是否有一些与作用域相关的概念我没有完全理解

函数默认值在函数定义时设置,而不是在调用时设置。因此,存储的不是表达式
var1
,而是变量表示的值,
23333
<定义函数时,code>var1恰好是一个局部变量,因为在生成类时,类主体中的所有名称都被视为函数中的局部变量,但名称
Foo
尚未存在,因为类尚未完成构建

改用sentinel,然后在函数体中确定
Foo.var1的当前值:

def __init__(self, var=None):
    if var is None:
        var = Foo.var1
    self.var = var
我在这里使用了
None
作为哨兵,因为它随时可用,并且不经常需要作为实际值。如果您确实需要能够将
var
设置为不同的(即非默认)值,请使用不同的单例哨兵:

_sentinel = object()

class Foo:
    var = 23333

    def __init__(self, var=_sentinel):
        if var is _sentinel:
            var = Foo.var1
        self.var = var

问题是,您试图在构建Foo的过程中引用它。在定义
Foo.\uuuu init\uuuu
的那一刻,也就是在计算
Foo.var
时,
Foo
还不存在(因为它的方法,即
Foo.\uuuuu init\uuuu
本身还没有完全构建)

函数/方法默认参数在函数/方法定义期间解析。类仅在定义后可用。如果类方法定义(即参数)引用类本身,则会得到循环依赖关系。没有类就不能定义方法,没有方法也不能定义类


请参阅Martijn Pieters关于如何实际处理此类依赖关系的回复。

请发布您在不进行手工编辑的情况下实际获得的内容。带有
>
提示符的第二个代码示例看起来像是交互式Python会话的一部分,但回溯来自执行脚本。如果您以交互方式尝试此代码,您会发现引发异常的是类定义,而不是构造对象的调用。@Duncan感谢您的建议!这是Python 3;所有类都自动继承自
对象
。在开篇文章中遗漏了这一类,感谢您指出。为了避免混淆,我去掉了这一部分。