Ich bin mir nicht ganz sicher, wie ich diese Frage stellen soll, geschweige denn, die Antwort zu finden, zum Teil, weil ich bei der Lösung dieses Problems völlig falsch liegen kann.In Python, was ist der beste Weg für mich, wiederverwendbaren Code zu schreiben, der mir Methoden zur Interaktion mit einer Liste von Objekten zur Verfügung stellt?
ich einige Python ich schreibe, und ich habe eine Klasse (Users
), die im Grunde verwendet, um eine Anzahl von Objekten eines bestimmten Typs (User
), zu instanziiert und dann eine Reihe von Methoden zur Verfügung stellen, um mich mit denen zu helfen, arbeiten Objekte in einer einfacheren Art und Weise. Der Code, den ich habe sieht wie folgt aus:
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
)
Ich habe eine Reihe von anderen Objekten in XML in ähnlicher Weise gespeichert - zum Beispiel Events
. Ich kann die Notwendigkeit sehen, die gleichen Methoden zu verwenden, die in Users
definiert werden, mit dem einzigen wirklichen Unterschied, der der Typ des Gegenstandes ist, der in der Liste enthalten wird, die in __init__
hergestellt wird.
Also die Frage ist: Was ist der beste Weg für mich, diesen Code wiederverwendbar zu machen, während die Lesbarkeit, etc. erhalten? Oder vielleicht bin ich völlig auf der falschen Spur.
Willst du sagen, NUR der Konstruktor wechselt zwischen User, Events, etc.? – ubadub
Was auch immer Sie tun, 'User' sollten mit ziemlicher Sicherheit kein Iterator sein, entweder definieren Sie Ihre eigene Klasse oder machen' __iter__' zu einer Generatorfunktion. Oder schau dir deine '__iter__' und' __next__' Implementierungen an, einfach 'def __iter __ (self): return iter (self.users)' –