2010-01-20 30 views
6

Tôi đang cố gắng tìm ra cách tốt nhất để thiết kế một vài lớp. Tôi khá mới với Python (và OOP nói chung) và chỉ muốn chắc chắn rằng tôi đang làm điều này đúng. Tôi có hai lớp: "Người dùng" và "Người dùng".Câu hỏi thiết kế lớp học newbie của 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]') 

Nếu tôi muốn lấy người dùng của tôi, tôi sử dụng:

for u in users.users: 
    print u.email 

"users.users" có vẻ là một chút dư thừa. Tôi làm đúng chứ hả?

Trả lời

11

Đặt này trong Users của bạn:

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

Bây giờ bạn có thể:

for u in users: 
    print u.email 

Docs

6

Bạn có lẽ chỉ muốn có một danh sách các đối tượng người dùng hơn là một lớp học, trong đó có nhiều người dùng .

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]')) 

Tất cả thuộc tính thành viên cho Người dùng phải nằm trong lớp Người dùng chứ không phải lớp Người dùng.

4

Tôi không thấy điều gì sai với người dùng.us, nhưng nếu bạn thích cách tốt hơn để làm điều đó, bạn có thể ghi đè __iter__ trong Người dùng.

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) 

Bây giờ bạn có thể làm điều này:

for u in users: 
    print u.email 

Các __iter__ phương pháp đặc biệt làm cho đối tượng của bạn cư xử như một iterator

17

Tôi có thể nói không thực sự. Lớp Users của bạn dường như chỉ là một danh sách người dùng, vì vậy tôi sẽ chỉ tạo danh sách đó thay vì toàn bộ lớp. Dưới đây là những gì tôi sẽ làm gì:

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]ple.com')) 

for u in users: 
    print u.email 

Nếu bạn muốn Users là một lớp học riêng của mình đối với một số lý do nào khác, bạn có thể có nó kế thừa từ list, hoặc (nếu không muốn nói), bạn có thể thêm những định nghĩa:

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

Bằng cách đó, bạn chỉ có thể nói:

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

LoạiError: iteration over non-sequence - nếu bạn đang sử dụng + = RHS cũng phải là một danh sách. – Jorenko

1

không có "đen" và "trắng" ở đây, chỉ cần sắc thái của màu xám. Bạn không cần một lớp đặc biệt Users nếu nó chỉ là một danh sách.

Một cách khác:

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) 

Sau đó, nếu bạn đã gõ ở trên vào 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]) 
>>> 

Chỉ cần một ví dụ để giúp bạn suy nghĩ.

+0

Không phải là 'self.all_users.append (self)' hoặc thậm chí 'A.all_users.append (self)' (cả hai công việc) thay vì 'self.users.append (self)'? – voyager

+0

Có, lỗi chính tả đã được sửa. Cảm ơn bạn đã tip-off! –

Các vấn đề liên quan