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")