<p>为了搜索所有<code>People</code>对象,您必须拥有所有<code>People</code>对象。你知道吗</p>
<p>但这意味着你首先不应该把它们放在一堆单独的变量中,而是放在一些集合中,比如一个列表。你知道吗</p>
<p>然后,<code>get_nonage</code>就可以得到这个列表。你知道吗</p>
<p>当我们在做的时候,<code>get_nonage</code>没有理由成为一个方法。它不是一个<code>People</code>实例所做的事情,而是您对一堆<code>People</code>实例所做的事情。你知道吗</p>
<p>所以:</p>
<pre><code>class People:
# ...
def get_nonage(people):
nonage = {person.uid: person.age for person in people if person.age<18}
print(nonage)
people = [
People(1, 11),
People(2, 20),
People(3, 35)
]
get_nonage(people)
</code></pre>
<hr/>
<p>在评论中,你会问:</p>
<blockquote>
<p>Can I just know the class is People, then use some method of People to directly get all data of its objects </p>
</blockquote>
<p>那是什么方法?你还没写呢。一个类通常不知道它的所有实例。你知道吗</p>
<p>当然,如果您真的想这样做,您可以让一个类在class属性中记录它的实例。(普通实例,如<code>age</code>,每个实例都有一个单独的值。类属性有一个由所有实例共享的值。)</p>
<p>例如:</p>
<pre><code>class People:
all_people = []
def __init__(self, uid, age):
self.uid = uid
self.age = age
self.all_people.append(self)
</code></pre>
<p>如果这样做,那么就可以将<code>get_nonage</code>变成一个类方法,也就是说,一个要在类本身而不是实例上调用的方法。类方法获取类<code>cls</code>作为其第一个参数,而不是实例<code>self</code>,并且它只能访问类属性,就像我们刚才创建的<code>all_people</code>。你知道吗</p>
<pre><code> @classmethod
def get_nonage(cls):
nonage = {person.uid: person.age for person in cls.all_people if person.age<18}
print(nonage)
</code></pre>
<p>现在,你可以叫它,不用传递任何东西,因为它已经知道了一切:</p>
<pre><code>people = [
People(1, 11),
People(2, 20),
People(3, 35)
]
People.get_nonage()
</code></pre>
<p>然而,这通常不是一个伟大的设计。例如,如果你想删除一个人呢?以前,您只需将它们从列表中删除(或者,在原始版本中,将<code>p3</code>重新分配给其他对象)。但是<code>People.all_people</code>不会知道你做了那件事;那个人仍然会在那里,而且仍然会被计算在内,即使你再也没有办法接近他们。你知道吗</p>