<p>在python中,类创建一个新的命名空间。除了有趣的业务(如元类),命名空间中的内容将成为<em>类</em>上的属性。在</p>
<pre><code>class Foo(object): #inherit from object in python2.x ... It's a good idea
class_variable = 3
__not_really_private_but_sort_of = 7
</code></pre>
<p>现在我创建了一个有2个属性的类。第一个是“公开”。第二个是“private”,在这个意义上,它以双下划线作为前缀,这将调用python的名称mangling。在python中,这是很少使用的<em>。毕竟,我们都是同意的程序员:)。在</p>
<p>当您调用一个<em>类</em>时,它将调用<code>__new__</code>方法(构造函数),然后(如果<code>__new__</code>返回该类的实例),它将调用<em>初始值设定项</em>(<code>__init__</code>)。大多数时候,您不需要对<code>__new__</code>做任何事情——默认的<code>__new__</code>做得很好。由于<code>__init__</code>是一个常规方法,因此它接收类的实例作为第一个参数——基本上填充来自其他语言的<code>this-></code>指针的角色:</p>
^{pr2}$
<p>与其他语言相比,python有一点奇怪:如果一个实例没有成员,python会在<em>类</em>上查找成员,然后在基类上查找(按方法解析顺序搜索)。如果它在任何地方都找不到成员,那么它将引发一个<code>AttributeError</code>。因此,如果我实例化上面的类,它将打印:</p>
<pre><code>__init__ called!
3
5
</code></pre>
<p>还请注意,我可以通过类访问类(如您所说的static)成员:</p>
<pre><code>print Foo.member
</code></pre>
<p>或者通过一个实例:</p>
<pre><code>print Foo().__class__.member
</code></pre>
<hr/>
<p>至于如何用python编写上面的PHP。。。答案是你不会的。最好这样写:</p>
<pre><code>class MyClass(object):
def __init__(self,mymember=None):
self.mymember = mymember
</code></pre>
<p>真的没有什么好的理由让一个设定者的唯一目的是设置一个私人成员。如果希望用户能够重置mymember属性,那么惯用的方法是让用户直接访问该属性,而不是强制用户调用函数来执行该操作。如果您发现您确实需要<code>mymember</code>功能,您可以在以后将<code>mymember</code>变成属性(如其他一些答案中所述)。在</p>