PythonWin 的 python 交互式 shell 调用构造函数两次?
-
09-06-2019 - |
题
回答的同时 Python 中的静态类变量
我注意到 PythonWin PyWin32 build 209.2 解释器似乎评估了两次?
PythonWin 2.5 (r25:51908, Mar 9 2007, 17:40:28) [MSC v.1310 32 bit (Intel)] on win32.
Portions Copyright 1994-2006 Mark Hammond - see 'Help/About PythonWin' for further copyright information.
>>> class X:
... l = []
... def __init__(self):
... self.__class__.l.append(1)
...
>>> X().l
[1, 1]
>>>
虽然 python 解释器做了正确的事情
C:\>python
ActivePython 2.5.0.0 (ActiveState Software Inc.) based on
Python 2.5 (r25:51908, Mar 9 2007, 17:40:28) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class X:
... l = []
... def __init__(self):
... self.__class__.l.append(1)
...
>>> X().l
[1]
>>>
解决方案
我的猜测如下。PythonWin 编辑器为对象提供自动完成功能,即当你输入时 myobject.
它提供了所有可用方法名称的一个小弹出窗口。所以我想当你打字时 X().
它正在创建一个实例 X
在后台做一个 dir
或类似的方法来找出对象的属性。
所以构造函数只被运行 每个对象一次 但为了给您提供交互性,它会在后台默默地创建对象,而不会告诉您这一点。
其他提示
Dave Webb 是正确的,您可以通过添加打印语句来看到这一点:
>>> class X:
... l = []
... def __init__(self):
... print 'inited'
... self.__class__.l.append(1)
...
然后,一旦您输入句点 X().
它打印 inited
在为您提供完成弹出窗口之前。
两个小附加点。
第一的, self.__class__.l.append(1)
实在不太明智。
说啊 self.l.append(1)
. 。Python 在搜索类的引用之前先搜索实例。
更重要的是,类级变量很少有用。类级常量有时是合理的,但即使如此,它们也很难证明其合理性。
在 C++ 和 Java 中,类级别 ('static
') 变量看起来很方便,但没有多大价值。它们很难教给 n00bz——经常在细节上浪费大量课堂时间——而且它们不太实用。如果您想了解已创建的 X 的所有实例,最好创建一个不依赖于类变量的 XFactory 类。
class XFactory( object ):
def __init__( self ):
self.listOfX= []
def makeX( self, *args, **kw ):
newX= X(*args,**kw)
self.listOfX.append(newX)
return newX
没有类级别变量异常。而且,它不会将 X 与 X 的集合混为一谈。从长远来看,当一个类既是某种东西又是某种东西的集合时,我发现它很令人困惑。
简单总比复杂好。
不隶属于 StackOverflow