PythonWin的python交互式shell调用构造函数两次?

时间:2008-09-17 08:42:08

标签: python activestate

回答Static class variables in Python

我注意到PythonWin PyWin32构建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]
>>>

3 个答案:

答案 0 :(得分:3)

我的猜测如下。 PythonWin编辑器为对象提供自动完成功能,即当您键入myobject.时,它会提供所有可用方法名称的一些弹出窗口。所以我想当你输入X().时,它会在后台创建一个X的实例并执行dir或类似操作来查找对象的属性。

所以构造函数只为每个对象运行一次,但是为了给你交互性它在后台静默创建对象而不告诉你它。

答案 1 :(得分:2)

Dave Webb是正确的,您可以通过添加打印声明来看到这一点:

>>> class X:
...     l = []
...     def __init__(self):
...             print 'inited'
...             self.__class__.l.append(1)
...             

然后,只要您在X().中键入句点,就会在向您提供完成弹出窗口之前打印inited

答案 2 :(得分:1)

两个小额外点。

首先,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的集合混为一谈。从长远来看,当一个类既是某个东西又是一些东西的集合时,我发现它令人困惑。

简单比复杂更好。