私は、この問題を解決するための私のアプローチが完全に間違っている可能性があるため、この質問をどのように聞くのか、それだけで答えを見つけることはできません。Pythonでは、オブジェクトのリストとやりとりするためのメソッドを提供する再利用可能なコードを書くための最良の方法は何ですか?
私はいくつかのPythonを書いている、と私は基本的には、特定のタイプ(User
)のオブジェクトの数をインスタンス化し、その後、私はそれらと連携を支援する方法の数を提供するために使用されるクラス(Users
)を持っていますより簡単な方法でオブジェクトを作成できます。私が持っているコードは次のようになります。
from defusedxml.ElementTree import parse
class Users:
def __init__(self, path):
self.path = path
self.users = []
users = parse(path).getroot()
for user in users:
u = User.user_from_xml(user)
self.users.append(u)
def __iter__(self):
self.i = 0
return self
def __next__(self):
if self.i < len(self.users):
self.i += 1
return self.users[(self.i - 1)]
else:
raise StopIteration
def get_user_by_id(self, user_id):
return next((user for user in self.users if user.id == user_id), None)
def search_attribute(self, attribute, value):
return [user for user in self.users if
getattr(user, attribute, None) != None and
value.lower() in str(getattr(user, attribute).lower())]
class User:
def __init__(self, user_id, username, email, first_name, last_name):
self.id = int(user_id)
self.username = username
self.email = email
self.first_name = first_name
self.last_name = last_name
def __repr__(self):
if self.first_name == None or self.last_name == None:
return "%s (User Id: %s)" % (self.username, self.id)
return "%s %s (%s)" % (self.first_name, self.last_name, self.username)
@staticmethod
def user_from_xml(user):
return User(
user.get("id"),
element.find("username").text,
element.find("email").text,
element.find("firstname").text,
element.find("lastname").text
)
私は、同様の方法でXMLに保存されている他のオブジェクトの数を持っている - 例えば、Events
。 Users
で定義されているのと同じメソッドを使用する必要があることがわかります。唯一の違いは__init__
で作成されたリストに含まれるオブジェクトのタイプです。
質問があります:可読性などを維持しながら、このコードを再利用可能にするにはどうすればよいでしょうか?または、私は完全に間違ったトラックにいるかもしれません。
あなたは、コンストラクタがUser、Eventsなどの間でのみ変更されると言っていますか? – ubadub
あなたが何をしても、 'Users'はイテレータではありません。あなた自身のクラスを定義するか、' __iter__'をジェネレータ関数にします。または、あなたの '__iter__'と' __next__'の実装を見て、 'def __iter____(self)'を実行してください:return iter(self.users) ' –