回答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]
>>>
答案 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的集合混为一谈。从长远来看,当一个类既是某个东西又是一些东西的集合时,我发现它令人困惑。
简单比复杂更好。