2 Stimmen

Erstellen einer Python-Benutzer()-Klasse, die sowohl neue Benutzer erstellt als auch bestehende Benutzer ändert

Ich versuche herauszufinden, wie ich am besten eine Klasse erstellen kann, mit der ich neue Benutzer in einem Schritt ändern und erstellen kann. Dies ist, was ich denke:

class User(object):

    def __init__(self,user_id):
      if user_id == -1
          self.new_user = True
      else:
          self.new_user = False

          #fetch all records from db about user_id
          self._populateUser() 

    def commit(self):
        if self.new_user:
            #Do INSERTs
        else:
            #Do UPDATEs

    def delete(self):
        if self.new_user == False:
            return False

        #Delete user code here

    def _populate(self):
        #Query self.user_id from database and
        #set all instance variables, e.g.
        #self.name = row['name']

    def getFullName(self):
        return self.name

#Create a new user
>>u = User()
>>u.name = 'Jason Martinez'
>>u.password = 'linebreak'
>>u.commit()
>>print u.getFullName()
>>Jason Martinez

#Update existing user
>>u = User(43)
>>u.name = 'New Name Here'
>>u.commit()
>>print u.getFullName()
>>New Name Here

Ist dies ein logischer und sauberer Weg, dies zu tun? Gibt es einen besseren Weg?

Danke.

4voto

ychaouche Punkte 4541

Sie können dies mit Metaklassen tun. Betrachten Sie dies:

class MetaCity:
    def __call__(cls,name):
        “”“
            If it’s in the database, retrieve it and return it
            If it’s not there, create it and return it
        ““”
            theCity = database.get(name) # your custom code to get the object from the db goes here
            if not theCity:
                # create a new one
                theCity = type.__call__(cls,name)

        return theCity

class City():
    __metaclass__ = MetaCity
    name   = Field(Unicode(64))

Jetzt können Sie Dinge tun wie :

paris = City(name=u"Paris") # this will create the Paris City in the database and return it.
paris_again = City(name=u"Paris") # this will retrieve Paris from the database and return it.

von: http://yassinechaouche.thecoderblogs.com/2009/11/21/using-beaker-as-a-second-level-query-cache-for-sqlalchemy-in-pylons/

3voto

Teddy Punkte 5763

Aus dem Stegreif würde ich Folgendes vorschlagen:

1: Ein Standardargument verwenden None anstelle von -1 für user_id im Konstruktor:

def __init__(self, user_id=None):
    if user_id is None:
         ...

2: Überspringen Sie die getFullName Methode - das ist nur Ihr Java, das spricht. Verwenden Sie stattdessen einen normalen Attributzugriff - Sie können ihn später in eine Eigenschaft umwandeln, wenn Sie es brauchen.

2voto

Yaroslav Punkte 2678

Was Sie zu erreichen versuchen, nennt man Aktives Datensatzmuster . Ich schlage vor, bestehende Systeme zu erlernen, die diese Art von Dingen anbieten, wie z. B. Elixier .

1voto

Kleine Änderung an Ihrem Initialisierungsprogramm:

def __init__(self, user_id=None):
      if user_id is None:

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