Étant relativement nouveau sur Python 2, je ne sais pas comment organiser au mieux mes fichiers de classe de la manière la plus «pythonique». Je ne poserais pas cette question si ce n'est que Python semble avoir plusieurs façons de faire qui sont très différentes de ce à quoi je m'attendais dans les langues auxquelles je suis habitué.La façon la plus "pythonique" d'organiser les attributs de classe, les arguments constructeur et les paramètres par défaut du constructeur de la sous-classe?
Au départ, je ne faisais que traitais les classes comment je l'habitude de les traiter en C# ou PHP, ce qui bien sûr m'a fait trébucher dans tous les sens quand j'ai découvert finalement les valeurs mutables Gotcha:
class Pants(object):
pockets = 2
pocketcontents = []
class CargoPants(Pants):
pockets = 200
p1 = Pants()
p1.pocketcontents.append("Magical ten dollar bill")
p2 = CargoPants()
print p2.pocketcontents
Yikes! Je ne m'attendais pas à ça! J'ai passé beaucoup de temps à chercher sur le Web et à trouver d'autres projets pour obtenir des conseils sur la meilleure façon d'organiser mes cours, et l'une des choses que j'ai remarquées, c'est que les gens déclarent beaucoup de leur exemple variables - mutables ou non - dans le constructeur, et empilent les arguments constructeurs par défaut assez souvent. Après avoir développé comme ça pendant un moment, je me suis encore un peu gratté la tête à propos de la non-familiarité de celui-ci. Considérant la longueur à laquelle le langage python va rendre les choses plus intuitives et évidentes, cela me semble tout à fait étrange dans les quelques cas où j'ai beaucoup d'attributs ou beaucoup d'arguments constructeurs par défaut, surtout quand je « m sous-classement:
class ClassWithLotsOfAttributes(object):
def __init__(self, jeebus, coolness='lots', python='isgoodfun',
pythonic='nebulous', duck='goose', pants=None,
magictenbucks=4, datawad=None, dataload=None,
datacatastrophe=None):
if pants is None: pants = []
if datawad is None: datawad = []
if dataload is None: dataload = []
if datacatastrophe is None: datacatastrophe = []
self.coolness = coolness
self.python = python
self.pythonic = pythonic
self.duck = duck
self.pants = pants
self.magictenbucks = magictenbucks
self.datawad = datawad
self.dataload = dataload
self.datacatastrophe = datacatastrophe
self.bigness = None
self.awesomeitude = None
self.genius = None
self.fatness = None
self.topwise = None
self.brillant = False
self.strangenessfactor = 3
self.noisiness = 12
self.whatever = None
self.yougettheidea = True
class Dog(ClassWithLotsOfAttributes):
def __init__(self, coolness='lots', python='isgoodfun', pythonic='nebulous', duck='goose', pants=None, magictenbucks=4, datawad=None, dataload=None, datacatastrophe=None):
super(ClassWithLotsOfAttributes, self).__init__(coolness, python, pythonic, duck, pants, magictenbucks, datawad, dataload, datacatastrophe)
self.noisiness = 1000000
def quack(self):
print "woof"
doux niaiserie de côté (je ne peux pas vraiment me aider lors de la cuisson jusqu'à ces classes par exemple artificiels), en supposant que j'ai un monde réel besoin pour un ensemble de classes avec ces nombreux attributs, je mes questions sont supposer:
Quel est le plus, uhh, façon « pythonique » de déclarer une classe avec que de nombreux attributs? Est-il préférable de les mettre contre la classe si la valeur par défaut est immuable, ala Pants.pockets, ou est-il préférable de les mettre dans le constructeur, ala ClassWithLotsOfAttributes.noisiness? Y at-il un moyen d'éliminer le besoin de redéclairer les valeurs par défaut pour tous les arguments du constructeur de la sous-classe, comme dans Dog .__ init__? Devrais-je même inclure de nombreux arguments avec des valeurs par défaut?
+1 Je dois aimer vos attributs d'exemple. Aussi, bonne question. – balpha