2010-01-20 12 views
6

Birkaç sınıf tasarlamanın en iyi yolunu bulmaya çalışıyorum. Python (ve genel olarak OOP) için oldukça yeni ve sadece bunu doğru yaptığımdan emin olmak istiyorum. İki sınıfım var: "Kullanıcılar" ve "Kullanıcı". Benim kullanıcılar almak istiyorsanızPython newbie sınıfı tasarım sorusu

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

, ben kullanın:

for u in users.users: 
    print u.email 

"users.users" biraz gereksiz gibi görünüyor. Bunu doğru mu yapıyorum?

cevap

11

senin Users koy:

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

Artık yapabilirsiniz:

for u in users: 
    print u.email 

Docs

6

Muhtemelen sadece Kullanıcı nesnelerin listesini yerine birden çok kullanıcıyı içeren bir sınıf istiyoruz .

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

Bütün üye Kullanıcı sınıfından değil Kullanıcılar sınıf bulunması gereken Kullanıcı için bağlıyor.

4

Kullanıcılar ile ilgili yanlış bir şey göremiyorum, ancak bunu yapmanın daha iyi bir yolunu tercih ederseniz, Kullanıcılar'da __iter__'u geçersiz kılabilirsiniz.

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) 

Şimdi bunu yapabilirsiniz:

for u in users: 
    print u.email 

__iter__ özel yöntem nesne yapar davranmasına

17

ben gerçekten söyleyebilirim bir yineleyici olarak. Users sınıfınızın sadece bir kullanıcı listesi olduğu anlaşılıyor, bu yüzden tüm bir sınıf yerine bir liste hazırlayacağım. İşte öyle yapardım:

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 

Eğer başka bir nedenden dolayı kendi başına bir sınıf olmak Users istiyorsanız, size tanımına bu ekleyebilir (değilse) o list devralan veya olabilir:

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

Bu şekilde, basitçe söyleyebiliriz:

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

TypeError: sigara dizisi üzerinde yineleme - kullandığınız takdirde + = RHS aynı zamanda bir liste olmalıdır. – Jorenko

1

hayır "beyaz", "siyah" ve burada, gri sadece tonları var. Sadece bir liste olacaksa özel bir Users sınıfına ihtiyacınız yoktur.

bir başka yolu: Sonra

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) 

, sen user.py yukarıdaki yazdıysanız:

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

Sadece bir örnek

düşündüğünü olsun.

+0

"self.users_append (self)" yerine "self.all_users.append (self)" veya "A.her_users.append (self)" (her ikisi de) değil midir? – voyager

+0

Evet, yazım hatası şimdi düzeltildi. Bahşiş için teşekkürler! –