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.