with tutorial programming para language framework espaƱol djangoproject desde cero applications python class

tutorial - framework django python



Clases de Python sin usar def__init__(self) (2)

Estoy escribiendo una serie de menús de texto. Con la clase y subclase a continuación se ejecuta sin problemas. Pero estoy revisando mi codificación y me pregunto ... ¿está bien que no haya usado def __init__(self) en las clases? ¿Debo haber colocado los miembros de datos en def __init__(Self): como self.images = (), self.options = ()? Si hiciera eso, entonces no podría usar el módulo abc para restricciones, ¿correcto?

class BaseMenu(object): __metaclass__ = abc.ABCMeta @abc.abstractproperty def options(self): pass @abc.abstractproperty def menu_name(self): pass def display(self): header = "FooBar YO" term = getTerminalSize() #sys.stdout.write("/x1b[2J/x1b[H") print header.center(term, ''*'') print self.menu_name.center(term, ''+'') print "Please choose which option:" for i in self.options: print( str(self.options.index(i)+1) + ") " + i.__name__ ) value = int(raw_input("Please Choose: ")) - 1 self.options[value](self) class Servers(BaseMenu): menu_name = "Servers" images = () foo = () def get_images(self): if not self.images: self.images = list_images.get_images() for img in self.images: print ( str(self.images.index(img)+1) + ") " + "Name: %s/n ID: %s" % (img.name, img.id) ) def get_foo(self): if not self.foo: self.foo = list_list.get_list() for list in self.foo: print "Name:", list.name print " ID:", list.id print def create_servers(self): create_server.create(self) options = ( get_images, get_foo, create_servers )


Su código está perfectamente bien. No es necesario tener un método __init__ .

Aún puedes usar __init__ , incluso con un ABC. Todo lo que el ABC prueba es si los nombres han sido definidos. La configuración de images en un __init__ requiere que defina un atributo de clase, pero puede establecerlo en None al principio:

class Servers(BaseMenu): menu_name = "Servers" images = None foo = None def __init__(self): self.images = list_images.get_images() self.foo = list_list.get_list()

Ahora puede establecer restricciones en el ABC que requieren que esté disponible una propiedad abstracta de images ; el atributo de clase images = None satisfará esa restricción.


class A: def a(self, a): print(a) ob = A() ob.a("Hello World")