2010-01-20 68 views
6

我想弄清楚設計幾個類的最佳方法。我對Python很陌生(一般而言是OOP),只是想確保我正確地做到這一點。我有兩個類:「用戶」和「用戶」。Python新手類設計問題

class User(object): 
    def __init__(self): 
     pass 

class Users(object): 
    def __init__(self): 
     self.users = [] 

    def add(self, user_id, email): 
     u = User() 
     u.user_id = user_id 
     u.email = email 
     self.users.append(u) 

users = Users() 
users.add(user_id = 1, email = '[email protected]') 

如果我想找回我的用戶,我使用:

for u in users.users: 
    print u.email 

「users.users」 似乎有點多餘。我做對了嗎?

回答

11

將這個在您的Users

def __iter__(self): 
    return iter(self.users) 

現在,您可以:

for u in users: 
    print u.email 

Docs

6

你可能只是想用戶對象的列表,而不是其中包含多個用戶類。

class User(object): 
    def __init__(self, user_id, email): 
     self.user_id = user_id 
     self.email = email 

users = [] 
users.append(User(user_id = 1, email = '[email protected]')) 

用戶的所有成員屬性應該駐留在User類中,而不是Users類中。

4

我看不出有什麼毛病users.users,但如果你喜歡一個更好的辦法做到這一點,你可以在用戶覆蓋__iter__。現在

class Users(object): 
    def __init__(self): 
     self.users = [] 

    def add(self, user_id, email): 
     u = User() 
     u.user_id = user_id 
     u.email = email 
     self.users.append(u) 

    def __iter__(self): 
     return iter(self.users) 

,你可以這樣做:

for u in users: 
    print u.email 

__iter__特殊方法使你的對象表現爲一個迭代

17

我想說的不是真的。你的Users類似乎只是一個用戶列表,所以我只是把它作爲一個列表而不是整個班級。這是我會做:

class User(object): 
    def __init__(self, user_id=None, email=None): 
     self.user_id, self.email = user_id, email 

users = [] 
users.append(User(user_id = 1, email = '[email protected]')) 

for u in users: 
    print u.email 

如果你想Users是其他一些原因一類自身的,你可以把它從list繼承,或(如果不是),你可以將這些添加至定義:

class Users(object): 
    # rest of code 
    def __iter__(self): 
     return iter(self.users) 

這樣的話,你可以簡單地說:

users = Users() 
... 
for u in users: 
    print u.email 
+0

TypeError:通過非序列迭代 - 如果您使用+ = RHS也應該是一個列表。 – Jorenko 2010-01-20 18:49:21

1

有沒有 「黑」 與 「白」 在這裏,只是灰色陰影。如果它只是一個列表,則不需要特殊的Users類。

另一種方式:

class User: 
    all_users = [] 

    def __init__(self, id, email): 
     self.id = id # No need to call it user_id - it's a User object, after all! 
     self.email = email 
     self.all_users.append(self) #automatically add to list of all users 

    def __str__(self): 
     return '%s(%s)' % (self.id, self.email) 

然後,如果你輸入到上述user.py

 
>>> from user import * 
>>> bob = User('bob', '[email protected]') 
>>> alice = User('alice', '[email protected]') 
>>> for u in User.all_users: 
...  print u 
... 
bob([email protected]) 
alice([email protected]) 
>>> 

只是一個例子,讓你思考。

+0

不應該是'self.all_users.append(self)'或甚至'A.all_users.append(self)'(都可以)而不是'self.users.append(self)'? – voyager 2010-01-20 18:07:32

+0

是的,現在打錯了。感謝您的提示! – 2010-01-20 18:16:10