Python新手类设计问题

时间:2010-01-20 17:38:38

标签: python oop iterator

我正试图找出设计几个课程的最佳方法。我对Python(以及一般的OOP)很陌生,只是想确保我做得对。我有两个类:“用户”和“用户”。

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”似乎有点多余。我这样做了吗?

5 个答案:

答案 0 :(得分:17)

我会说不是真的。你的Users类看起来只是一个用户列表,所以我只想把它作为一个列表而不是整个类。这就是我要做的事情:

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

如果由于其他原因希望Users成为自己的类,可以让它继承自list,或者(如果没有)你可以将它们添加到定义中:

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

这样,您可以简单地说:

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

答案 1 :(得分:11)

将其放入Users

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

现在你可以:

for u in users:
    print u.email

Docs

答案 2 :(得分:6)

您可能只需要一个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类中。

答案 3 :(得分:4)

我没有看到users.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__特殊方法使您的对象表现为迭代器

答案 4 :(得分:1)

这里没有“黑色”和“白色”,只有灰色阴影。如果它只是一个列表,你不需要一个特殊的Users类。

另一种方式:

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

只是一个让你思考的例子。