Код, как показано ниже, только базовая структура:
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
не имели specialmethod
, но этот метод должен быть доступен для экземпляров A
и B
.
Я могу переопределить этот метод в классе C
и вызвать ошибку, но я бы предпочел не делать этого.
Я понимаю, что могу добавить код для проверки _disallowed_methods
в FooType
и на основе этой проверки, есть ли у instance
какие-либо из них в выводе dir(instance)
. Но я не могу удалить метод из __dict__
из C
, используя любые методы, которые я пробовал до сих пор. Я попробовал следующие методы: delattr(instance, 'specialmethod')
и del instance.__dict__['specialmethod']
.
.
Метод delattr
приводит к «AttributeError: specialmethod», а метод del
приводит к «TypeError: объект« dict_proxy »не поддерживает удаление элемента»
В основном многие различные классы наследуются от Foo
, но некоторые из них не должны иметь специальных методов, таких как C
, для которых не должно быть specialmethod
.
Что я делаю не так? Или как еще я могу это сделать?