2012-05-11 208 views
2

這裏對象添加到Python的集收集,並確定是我的代碼:通過對象的屬性

#!/usr/bin/python 

class Person(): 
    def __init__(self, name, age): 
     self.name = name 
     self.age = age 

    def get_detail(self): 
     print "I am %s , my age is %d" % (self.name, self.age) 


if __name__ == '__main__': 
    tom = Person('tom', 18) 
    jack = Person('jack', 20) 
    mary = Person('mary', 22) 
    mary2 = Person('mary2', 22) 
    mary3 = Person('mary3', 22) 

    person_set = set([]) 
    person_set.add(tom) 
    person_set.add(jack) 
    person_set.add(mary) 
    person_set.add(mary2) 
    person_set.add(mary3) 
    for man in person_set: 
     man.get_detail() 

結果:

I am jack , my age is 20 
I am mary2 , my age is 22 
I am tom , my age is 18 
I am mary , my age is 22 
I am mary3 , my age is 22 

預期結果:

I am jack , my age is 20 
I am tom , my age is 18 
I am mary , my age is 22 

按照預期結果,我的意思是當我將Person添加到person_set中時,我想確定新人是否已經完全通過屬性age。什麼是正確的方式來做到這一點?

+1

所以,作爲一個例子,'弗蘭克,年齡19'將是一樣'希瑟,19'年代,如果你只是按年齡比較? – jamylak

+0

是的,只有第一個被添加到集合中才會被存儲 – sashimi

+3

@sashimi,那麼你需要一個字典,其中age作爲key,Person對象作爲值。 – spinlok

回答

15

當一個新對象被添加到python集合中時,首先計算該對象的哈希代碼,然後,如果一個或多個具有相同哈希代碼的對象已經在集合中,則測試這些對象與新對象平等。

這樣做的結果是你需要在你的類上實現__hash__(...)__eq__(...)方法。例如:

>>> class Person(object): 
... def __init__(self, name, age): 
...  self.name = name 
...  self.age = age 
... def __eq__(self, other): 
...  return self.age == other.age 
... def __hash__(self): 
...  return hash(self.age) 
... def get_detail(self): 
...  print "I am %s, my age is %d" % (self.name, self.age) 
... 
>>> 
>>> tom = Person('tom', 18) 
>>> jack = Person('jack', 20) 
>>> mary = Person('mary', 22) 
>>> mary2 = Person('mary2', 22) 
>>> mary3 = Person('mary3', 22) 
>>> 
>>> person_set = set() 
>>> person_set.add(tom) 
>>> person_set.add(jack) 
>>> person_set.add(mary) 
>>> person_set.add(mary2) 
>>> person_set.add(mary3) 
>>> 
>>> len(person_set) 
3 
>>> 
>>> for p in person_set: 
... p.get_detail() 
... 
I am tom, my age is 18 
I am jack, my age is 20 
I am mary, my age is 22 

但是,你應該非常仔細地對正確實施__hash____eq__應該是什麼類的想法。上面的例子是有效的,但是沒有意義(例如,__hash____eq__僅僅是根據年齡定義的)。

+0

謝謝〜這就是我想要的,我知道這很奇怪。我將使用的** Person **這樣的類非常簡單,因此無論是否改寫都不重要。我知道這是不受歡迎的^ _ ^,我會小心使用它 – sashimi

0

如果需要簡單地添加新的用戶設置,你可以使用這個簡單的檢查:

for man in person_set: 
    if man.age is tom.age: 
     print 'exist' 

,但如果你有很多元素的集合,需要實現__ 哈希 __( ...),__ EQ __(...)