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()"中输入句点,它就会在提供完成弹出窗口之前打印"已初始化"。