回答的同时 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 或类似的方法来找出对象的属性。

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

其他提示

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

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

然后,一旦您输入句点 X(). 它打印 inited 在为您提供完成弹出窗口之前。

两个小附加点。

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

简单总比复杂好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top