Я пытаюсь выяснить лучший способ разработать несколько классов. Я довольно плохо знаком с 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 = 'bob@example.com')
Если я хочу получить своих пользователей, я использую:
for u in users.users:
print u.email
"users.users", кажется, немного избыточен. Я делаю это правильно?
Поместите это в своих пользователях
:
def __iter__(self):
return iter(self.users)
Теперь вы можете:
for u in users:
print u.email
Я бы не на самом деле. Ваш Пользователи
класс, по-видимому, просто будет список пользователей, поэтому я бы просто сделал его список, а не целый класс. Вот что я бы сделал:
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 = 'bob@example.com'))
for u in users:
print u.email
Если вы хотите пользователей
, чтобы быть классом самостоятельно по какой-то другой причине, вы могли бы наследовать из Список
или (если нет) Вы можете добавить их в определение:
class Users(object):
# rest of code
def __iter__(self):
return iter(self.users)
Таким образом, вы можете просто сказать:
users = Users()
...
for u in users:
print u.email
Вам, вероятно, нужен просто список объектов User, а не класс, который содержит несколько пользователей.
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 = 'bob@example.com'))
Все атрибуты члена User должны находиться в классе User, а не в классе 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 __
делает ваш объект вести себя как итератор
Нет «черных» и «белых» здесь, просто оттенки серого. Вам не нужен специальный пользователей
, если это просто будет список.
Другой способ:
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', 'bob@test.com') >>> alice = User('alice', 'alice@test.com') >>> for u in User.all_users: ... print u ... bob(bob@test.com) alice(alice@test.com) >>>
Просто пример, чтобы привести вас задуматься.