擅长:python、mysql、java
<p>实际上,<code>name</code>和<code>books</code>都是类级别的。只是字符串是不可变的,所以当您使用<code>uzumaxy.name = "Maxim"</code>时,您将添加一个名为<code>name</code>的新属性来隐藏类<code>name</code>,而对于<code>uzumaxy.books.append("Programming via .NET")</code>,您将访问现有的(类)<code>books</code>并对其进行修改。您的代码等效于:</p>
<pre><code>class Human(object):
name = ''
books = []
def say_hello(self):
sys.stdout.write("Hello!")
</code></pre>
<p>注意同样的行为。传统上,我们会这样写<code>Human</code>来解决这个问题:</p>
<pre><code>class Human(object):
def __init__(self):
self.name = ''
self.books = []
def say_hello(self):
sys.stdout.write("Hello!")
</code></pre>
<p>现在每个实例都有自己的<code>name</code>和<code>books</code>。要对动态创建的类型执行此操作,您可以执行基本相同的操作,给它一个<code>__init__</code>:</p>
<pre><code>def init_human(self):
self.name = ''
self.books = []
attributes = { '__init__': init_human,
'say_hello': lambda self: sys.stdout.write("Hello!") }
</code></pre>