Korrekte måde at angive objekt instans variabler

Jeg er ved at skrive en klasse til at indsætte brugere i en database, og inden jeg kommer for langt i, jeg vil bare være sikker på, at min OO tilgang er ren

class User(object):

    def setName(self,name):

        #Do sanity checks on name
        self._name = name

    def setPassword(self,password):

        #Check password length > 6 characters
        #Encrypt to md5
        self._password = password

    def commit(self):

        #Commit to database

>>u = User()
>>u.setName('Jason Martinez')
>>u.setPassword('linebreak')
>>u.commit()

Er dette den rigtige fremgangsmåde?
Skal jeg erklære klasse variabler op i toppen?
Skal jeg bruge en _ foran hele klasse variabler til at gøre dem private?

Tak for at hjælpe til.

Ingen klasse variabler i din kode. Du bør overveje at opdatere din titel.
Hvad tutorial, du bruger til at lære Python. Dette bør være omfattet. Da det ikke er, jeg vil gerne vide, hvad tutorial, du bruger.
“object instance variables” kaldet “attributes” i Python

OriginalForfatteren ensnare | 2010-03-26

4 svar

  1. 21

    Det er generelt korrekte, AFAIK, men du kan rense det op med egenskaber.

    class User(object):
    
        def _setName(self, name=None):
            self._name = name
    
        def _getName(self):
            return self._name
    
        def _setPassword(self, password):
            self._password = password
    
        def _getPassword(self):
            return self._password
    
        def commit(self):
            pass
    
        name = property(_getName, _setName)
        password = property(_getPassword, _setPassword)
    
    >>u = User()
    >>u.name = 'Jason Martinez'
    >>u.password = 'linebreak'
    >>u.commit()

    Der er også en praktisk dekoratør-baseret syntaks, docs forklare, at der også.

    Dette var virkelig hjælpsomme. Tak skal du have.
    Jeg har bemærket, at din constructor accepteret en obligatorisk name argument, så dit eksempel på brug af User() ville smide en fejl. Jeg har redigeret min eksempel til standard name at None for at undgå dette, men du måske ønsker at give en overbelastet gennemførelse med nogen argumenter overhovedet.
    Ja, tak!

    OriginalForfatteren bcherry

  2. 7

    ved hjælp af en enkelt _ gør ikke din attributter private: det er en konvention, der fortæller, at det er en indre egenskab, og bør ikke under normale omstændigheder kan tilgås af eksterne kode. Med din kode, det betyder også, password og navn er skrivebeskyttet.

    Jeg stærkt anbefaler, at du bruger en initialiser for din klasse, som vil forberede dine attributter, selvom det er en standard værdi, såsom Ingen : det vil gøre tingene nemmere i, at du forpligter metode, hvor du ikke vil have til at kontrollere for tilstedeværelsen af _navnet og _password attributter (med hasattr).

    Bruge Pylint på din kode.

    OriginalForfatteren gurney alex

  3. 3

    Der er ingen klasse variabler i, at koden kun instans attributter. Og brug egenskaber i stedet for adgangsmetoder. Og skaber den instans attributter i startværdi, fortrinsvis fra værdier, der er videregivet i:

    class User(object):
      def __init__(self, name, password='!!'):
        self.name = name
        self.password = password
    
      ...
    Tak for svaret. Jeg er ikke sikker på, hvilke egenskaber er, men jeg vil læse op. Brugeren objekt har en masse variabler, 50 eller så, så jeg tror, det ville være alt for mange til at gå ind i konstruktøren, ikke? Jeg ved, at der er i øjeblikket ingen klasse variabler i koden. Hvad jeg mener er, skal jeg gøre disse klasse variabler? Tak.
    Aldrig nogensinde bruge klasse variabler, når værdien nødt til at variere fra instans til instans.

    OriginalForfatteren Ignacio Vazquez-Abrams

  4. 2

    Andre allerede påpegede, at ud: undgå at bruge settere og getters og bruge simpel attribut, der er inkluderet, hvis du ikke behøver at udføre yderligere logik når at få/indstilling af din attribut.
    Hvis du har brug for at yderligere logik og brug derefter egenskaber.

    Hvis du har mange parametre at gå til en instans startværdi overveje at bruge en separat objekt eller ordbog, der indeholder alle parametre:

    >>> class User(object):
    ...     def __init__(self, params):
    ...         self.__dict__.update(params)
    ... 
    
    >>> params = {
    ...     'username': 'john',
    ...     'password': 'linebreak',
    ...     }
    >>> user = User(params)
    >>> user.username
    'john'
    >>> user.password
    'linebreak'

    P. S. I dit tilfælde af du don ‘ t nødt til at erklære din attributter på klasse-niveau.
    Normalt, der er gjort, hvis du ønsker at dele den samme værdi på tværs af alle klasse tilfælde:

    >>> class User(object):
    ...     type = 'superuser'
    ... 
    >>> user = User()
    >>> user2 = User()
    >>> 
    >>> user.type
    'superuser'
    >>> user2.type
    'superuser'
    >>> 
    >>> user2.type = 'instance superuser'
    >>> 
    >>> user.type
    'superuser'
    >>> user2.type
    'instance superuser'
    >>> User.type
    'superuser'

    OriginalForfatteren Ruslan Spivak

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *