擅长:python、mysql、java
<p>Python类的工作方式与其他语言中的类略有不同。
例如,python中没有私有属性。只是命名约定暗示方法或成员变量不打算用于公共用途(前导<code>_</code>)。</p>
<p>虽然每个类都必须具有属性<code>__new__</code>和<code>__init__</code>,这两个属性共同构建了其他语言可能调用的构造函数,但基本python类实现了这些方法。如果不需要,您不必重写它们。</p>
<p>这很好:</p>
<pre><code>class A:
def hello(self):
print('Hello, World')
a = A()
a.hello()
</code></pre>
<p>在python中,<code>__new__(cls, ...)</code>首先用于创建请求的<code>cls</code>的类实例。然后将新创建的实例作为<code>self</code>传递给<code>__init__(self, ...)</code>。</p>
<p><code>__new__</code>和<code>__init__</code>方法都接收传递给<em>构造表达式</em>的参数。这就是python调用<code>m = MyClas(1, 2, 3)</code>的方式。</p>
<pre><code>class A:
def __new__(cls, *args, **kwargs):
print('In __new__')
print(args)
print(kwargs)
return object.__new__(cls) # create a new object of type cls
def __init__(self, *args, **kwargs):
print('In __init__')
print(args)
print(kwargs)
a = A(1, 2, c=3)
</code></pre>
<p>结果:</p>
<pre><code>In __new__
(1, 2)
{'c': 3}
In __init__
(1, 2)
{'c': 3}
</code></pre>