6 Stimmen

Python Neuling Klasse Design Frage

Ich versuche herauszufinden, wie ich am besten ein paar Klassen gestalten kann. Ich bin ziemlich neu in Python (und OOP im Allgemeinen) und möchte nur sicherstellen, dass ich dies richtig tue. Ich habe zwei Klassen: "Benutzer" und "Benutzer".

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

Wenn ich meine Benutzer abrufen möchte, verwende ich:

for u in users.users:
    print u.email

"users.users" scheint ein wenig redundant zu sein. Mache ich das richtig?

17voto

Chris Lutz Punkte 69879

Ich würde sagen, nicht wirklich. Ihr Users Klasse scheint nur eine Liste von Benutzern zu sein, also würde ich sie zu einer Liste und nicht zu einer ganzen Klasse machen. So würde ich vorgehen:

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

Wenn Sie wollen Users aus einem anderen Grund eine eigene Klasse sein soll, könnten Sie sie von list oder (falls nicht) können Sie diese in die Definition aufnehmen:

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

Auf diese Weise können Sie einfach sagen:

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

11voto

recursive Punkte 80517

Legen Sie dies in Ihr Users :

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

Jetzt können Sie das:

for u in users:
    print u.email

Dokumente

6voto

cquillen Punkte 1219

Wahrscheinlich wollen Sie nur eine Liste von Benutzerobjekten und nicht eine Klasse, die mehrere Benutzer enthält.

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

Alle Member-Attribute für User sollten sich in der Klasse User befinden, nicht in der Klasse Users.

4voto

Nadia Alramli Punkte 105256

Ich sehe nichts Falsches an users.users, aber wenn Sie eine schönere Methode bevorzugen, können Sie die __iter__ in Benutzer.

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)

Jetzt können Sie dies tun:

for u in users:
    print u.email

En __iter__ spezielle Methode lässt Ihr Objekt sich wie ein Iterator verhalten

1voto

Vinay Sajip Punkte 89444

Hier gibt es kein "Schwarz" und "Weiß", sondern nur Grautöne. Sie brauchen keine spezielle Users Klasse, wenn es sich nur um eine Liste handeln soll.

Eine andere Möglichkeit:

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)

Wenn Sie dann die obigen Angaben in 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)
>>>

Nur ein Beispiel, um Sie zum Nachdenken anzuregen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X