Siendo relativamente nuevo en Python 2, no estoy seguro de cómo organizar mejor mis archivos de clase de la manera más "pitónica". No preguntaría esto, sino el hecho de que Python parece tener bastantes formas de hacer las cosas que son muy diferentes a lo que esperaba de los idiomas a los que estoy acostumbrado.¿La forma más "pitónica" de organizar los atributos de clase, los argumentos de constructor y los valores por defecto del constructor de subclase?
Inicialmente, sólo estaba tratando a clases de cómo me lo general los trato en C# o PHP, que por supuesto me hizo tropezar a todo el lugar cuando finalmente descubrí los valores 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
¡Ay! ¡No esperaba eso!
He pasado mucho tiempo buscando en la web y en alguna fuente de otros proyectos pistas sobre la mejor manera de organizar mis clases, y una de las cosas que noté fue que la gente parece declarar mucho de su instancia variables - mutable o de otro tipo - en el constructor, y también apila los argumentos de constructor por defecto bastante bastante.
Después de desarrollar así por un tiempo, todavía me estoy rascando la cabeza un poco sobre la falta de familiaridad de la misma. Teniendo en cuenta la duración del lenguaje de Python para hacer que las cosas parezcan más intuitivas y obvias, me parece francamente extraño en los pocos casos en los que tengo bastantes atributos o muchos argumentos de constructor predeterminados, especialmente cuando 'm de subclases:
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"
torpeza leve a un lado (en realidad no puedo ayudarme a mí mismo cuando se cocina a estas clases de ejemplo artificiales), suponiendo que tengo un mundo real necesidad de un conjunto de clases con tantos atributos, yo suponer que mis preguntas son:
Cuál es el, uhh, forma más 'Pythonic' de declarar una clase con esa cantidad de atributos? ¿Es mejor ponerlos en contra de la clase si el valor predeterminado es inmutable, como Pants.pockets, o es mejor ponerlos en el constructor, ala ClassWithLotsOfAttributes.noisiness?
¿Hay alguna forma de eliminar la necesidad de redeclarar los valores predeterminados para todos los argumentos del constructor de subclase, como en Dog .__ init__? ¿Debería incluso incluir tantos argumentos con los valores predeterminados?
+1 Me encantan sus atributos de ejemplo. Además, buena pregunta. – balpha