62 votes

Comment définir une classe en Python

Assez simple, j'apprends le python et je ne trouve pas de référence qui me dise comment écrire ce qui suit:

 public class Team {
     private String name;
     private String logo;
     private int members;

     public Team(){}

     // getters/setters 
 }
 

Plus tard:

 Team team = new Team();
team.setName( "Oscar" );
team.setLogo( "http://...." );
team.setMembers( 10 );
 

C’est une classe d’équipe avec les propriétés: nom / logo / membres

Edit Après quelques tentatives, j'ai eu ceci:

 class Team:
    pass
 

Plus tard

 team = Team()
team.name="Oscar"
team.logo="http://..."
team.members=10
 

Est-ce la façon python ?? Ça me semble étrange (bien sûr, bien sûr)

120voto

steveha Points 24808

Voici ce que je recommande:

class Team(object):
    def __init__(self, name=None, logo=None, members=0):
        self.name = name
        self.logo = logo
        self.members = members

team = Team("Oscar", "http://...", 10)

team2 = Team()
team2.name = "Fred"

team3 = Team(name="Joe", members=10)

Quelques notes sur ce.

0) j'ai déclaré que l'Équipe hérite object. Cela rend l'Équipe d'un "nouveau style de classe"; cela a été la pratique recommandée en Python car il a été introduit en Python 2.2. (En Python 3.0 et au-dessus, les classes sont toujours "nouveau style", même si vous quittez l' (object) de la notation, mais n'ayant que la notation ne fait pas de mal et rend l'héritage explicite.) Voici un StackOverflow discussion de la nouvelle-classes de style.

1) Il n'est pas nécessaire, mais j'ai fait l'initialiseur de prendre les arguments optionnels de sorte que vous pouvez initialiser l'instance sur une seule ligne, comme je l'ai fait avec team et team3. Ces arguments sont nommés, ce qui vous permet de fournir des valeurs que les paramètres positionnels (comme avec team) ou vous pouvez utiliser l' argument= forme comme je l'ai fait avec team3. Lorsque vous spécifiez explicitement le nom des arguments, vous pouvez spécifier des arguments dans n'importe quel ordre.

2) Si vous avez besoin de getter et setter fonctions, peut-être pour vérifier quelque chose, en Python, vous pouvez déclarer la méthode spéciale de fonctions. C'est ce que Martin v. Löwis dire quand il a dit "bien" descripteurs. En Python, il est généralement considéré comme une bonne pratique de simplement attribuer aux variables membres, et il suffit de faire référence à chercher, parce que vous pouvez toujours ajouter dans la propriété des descripteurs plus tard si vous en avez besoin. (Et si vous n'avez jamais besoin d'eux, puis votre code est moins encombré et vous a pris moins de temps pour écrire. En Bonus!)

Voici un bon lien sur la propriété descripteurs: http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/

3) Il n'a pas vraiment d'importance si vous spécifiez des valeurs dans le cadre de l'appel à Team() ou si vous pousser dans votre instance de classe plus tard. La dernière instance de la classe en fin de compte vous seront identiques.

team = Team("Joe", "http://example.com", 1)
team2 = Team()
team2.name = "Joe"
team2.logo = "http://example.com"
team2.members = 1

print team.__dict__ == team2.__dict__

La ci-dessus sera imprimée True. (Vous pouvez facilement surcharge de l' == opérateur de Team des cas, et de faire en Python faire la bonne chose quand vous dites team == team2 , mais cela ne se fait pas par défaut.)


EDIT: j'ai oublié une chose dans la réponse ci-dessus, et j'aimerais ajouter maintenant. Si vous ne l'argument optionnel chose sur l' __init__() fonction, vous devez être prudent si vous voulez fournir un "mutable" comme un argument facultatif.

Des entiers et des chaînes sont "immuable". Vous ne pouvez jamais changer de place; ce qui se passe à la place Python crée un nouvel objet et remplace celle que vous aviez avant.

Les listes et les dictionnaires sont "mutable". Vous pouvez garder le même objet autour de toujours, ajout et suppression de celle-ci.

x = 3   # the name "x" is bound to an integer object with value 3
x += 1  # the name "x" is rebound to a different integer object with value 4

x = []  # the name "x" is bound to an empty list object
x.append(1)  # the 1 is appended to the same list x already had

La chose principale que vous devez savoir: les arguments optionnels sont évaluées qu'une seule fois, lorsque la fonction est compilé. Donc, si vous passez un mutables comme un argument facultatif dans l' __init__() pour votre classe, puis chaque instance de votre classe d'actions d'un objet mutable. Ce n'est presque jamais ce que vous voulez.

class K(object):
    def __init__(self, lst=[]):
        self.lst = lst

k0 = K()
k1 = K()

k0.lst.append(1)

print k0.lst  # prints "[1]"
print k1.lst  # also prints "[1]"

k1.lst.append(2)

print k0.lst  # prints "[1, 2]"

La solution est très simple:

class K(object):
    def __init__(self, lst=None):
        if lst is None:
            self.lst = []  # bind lst with a new, empty list
        else:
            self.lst = lst # bind lst with provided list

k0 = K()
k1 = K()

k0.lst.append(1)

print k0.lst  # prints "[1]"
print k1.lst  # print "[]"

Ce métier à l'aide d'un argument par défaut la valeur de None, puis les essais que l'argument transmis is None, est considéré comme un Python, modèle de conception, ou au moins un idiome, vous devez maîtriser.

63voto

Martin v. Löwis Points 61768
 class Team:
  def __init__(self):
    self.name = None
    self.logo = None
    self.members = 0
 

En Python, vous n'écrivez généralement pas les getters et les setters, à moins que vous n'ayez réellement une implémentation non triviale pour eux (vous utilisez alors des descripteurs de propriété).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X