我正试图找出设计几个课程的最佳方法。我对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”似乎有点多余。我这样做了吗?
答案 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)
答案 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) >>>
只是一个让你思考的例子。