3

在 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]
>>>
4

3 回答 3

3

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

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

于 2008-09-17T08:57:41.313 回答
2

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

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

然后,在您输入完成弹出窗口之前,X().它会立即打印出来。inited

于 2008-09-17T15:08:22.247 回答
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 的集合混为一谈。从长远来看,当一个类既是一些东西又是一些东西的集合时,我会感到困惑。

简单比复杂好。

于 2008-09-17T10:18:30.027 回答