python类属性不能用作构造函数的参数?
在python 3中,我发现class属性可以用作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
\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;所有类都自动继承自对象
。在开篇文章中遗漏了这一类,感谢您指出。为了避免混淆,我去掉了这一部分。