El código es como abajo, sólo la estructura básica:Eliminación de métodos específicos de la clase hija que se heredan de la clase padre
class FooType(type):
def __new__(cls, name, bases, classdict):
instance = type.__new__(cls, name, bases, classdict)
# What can I do here?
return instance
class FooBase(object, metaclass=FooType):
def __init__(self):
pass
class Foo(FooBase):
def __init__(self, name):
self.name = name
def method1(self):
pass
def method2(self):
pass
def specialmethod(self):
pass
class A(Foo):
pass
class B(Foo):
pass
class C(Foo):
_disallowed_methods = ['specialmethod']
Lo que quiero hacer es que las instancias de la clase C
no deberían tener specialmethod
, pero ese método debería estar disponible para las instancias A
y B
.
Puedo anular este método en la clase C
y generar un error, pero preferiría no hacerlo.
que se dan cuenta de que puedo añadir en el código para comprobar _disallowed_methods
en el FooType
y sobre la base de que el registro si el instance
tiene cualquiera de ellos en la salida de dir(instance)
. Pero parece que no puedo eliminar el método de __dict__
de C
usando los métodos que he probado hasta ahora. Los métodos que probé son delattr(instance, 'specialmethod')
y del instance.__dict__['specialmethod']
.
Los delattr
método da como resultado "AttributeError: specialmethod", y los del
método da como resultado "TypeError: objeto 'dict_proxy' no admite la eliminación elemento"
Básicamente muchas clases diferentes heredarán de Foo
, pero algunas de las ellos no deberían tener métodos específicos disponibles para ellos como C
que no deberían tener specialmethod
disponible.
¿Qué estoy haciendo mal? ¿O cómo más puedo lograr esto?
Por cierto: Esto violaría la [principio de sustitución de liskov] (http://en.wikipedia.org/wiki/Liskov_substitution_principle). – pillmuncher