PythonWin的python交互式shell两次调用构造函数?
时间:2020-03-05 18:58:18 来源:igfitidea点击:
在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
或者类似方法来查找对象的属性。
因此,构造函数仅对每个对象运行一次,但为了给我们带来交互性,它在后台静默创建对象,而无需告诉我们。
回答
两个小添加点。
首先,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的集合混淆。从长远来看,当一个类既是事物又是事物的集合时,我会感到困惑。
简单胜于复杂。
回答
戴夫·韦伯(Dave Webb)是正确的,我们可以通过添加一条打印语句来看到这一点:
>>> class X: ... l = [] ... def __init__(self): ... print 'inited' ... self.__class__.l.append(1) ...
然后,只要在" X()"中输入句点,它就会在提供完成弹出窗口之前打印"已初始化"。