Удаление определенных методов из дочернего класса, унаследованных от родительского класса

Код такой, как показано ниже, только базовая структура:

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']

Я хочу, чтобы экземпляры класс C не должен иметь специальный метод , но этот метод должен быть доступен для экземпляров A и B .

Я могу переопределить это метод в классе C и вызывает ошибку, но я бы предпочел этого не делать.

Я понимаю, что могу добавить код для проверки _disallowed_methods в FooType и на основе этого проверьте, есть ли у экземпляра какие-либо из них в выводе dir (instance) . Но я не могу удалить метод из __ dict __ из C , используя какие-либо методы, которые я пробовал до сих пор. Методы, которые я пробовал: delattr (instance, 'specialmethod') и del instance .__ dict __ ['specialmethod'] .

Метод delattr results в «AttributeError: specialmethod», а метод del приводит к «TypeError: объект 'dict_proxy' не поддерживает удаление элемента»

В основном многие различные классы наследуются от Foo , но у некоторых из них не должно быть специальных доступных методов, таких как C , для которых не должен быть доступен специальный метод .

Что я делаю не так? Или как еще я могу это сделать?

9
задан skulled 14 July 2011 в 13:22
поделиться