Класс новичка Python разрабатывает вопрос

Я пытаюсь выяснить лучший способ разработать несколько классов. Я довольно плохо знаком с 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", кажется, немного избыточен. Я делаю это правильно?

6
задан recursive 20 January 2010 в 17:46
поделиться

5 ответов

Поместите это в своих пользователях :

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

Теперь вы можете:

for u in users:
    print u.email

Docs

11
ответ дан 8 December 2019 в 02:21
поделиться

Я бы не на самом деле. Ваш Пользователи класс, по-видимому, просто будет список пользователей, поэтому я бы просто сделал его список, а не целый класс. Вот что я бы сделал:

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
17
ответ дан 8 December 2019 в 02:21
поделиться

Вам, вероятно, нужен просто список объектов 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.

6
ответ дан 8 December 2019 в 02:21
поделиться

Я не вижу ничего плохого с пользователями. Производители, но если вы предпочитаете приятный способ сделать это, вы можете переопределить __ 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 __ делает ваш объект вести себя как итератор

4
ответ дан 8 December 2019 в 02:21
поделиться

Нет «черных» и «белых» здесь, просто оттенки серого. Вам не нужен специальный пользователей , если это просто будет список.

Другой способ:

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

Просто пример, чтобы привести вас задуматься.

1
ответ дан 8 December 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: