Код такой, как показано ниже, только базовая структура:
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
, для которых не должен быть доступен специальный метод
.
Что я делаю не так? Или как еще я могу это сделать?