的代碼如下,只是基本的結構:刪除從子類的具體方法,其是從父類繼承
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
中覆蓋此方法並引發錯誤,但我不希望這樣做。
我知道我可以在代碼添加到您在該FooType
_disallowed_methods
和檢查的基礎上,如果instance
有任何人在dir(instance)
輸出。但我似乎無法使用我迄今嘗試過的任何方法從的C
中刪除該方法。我嘗試的方法是delattr(instance, 'specialmethod')
和del instance.__dict__['specialmethod']
。
的delattr
方法導致「AttributeError的:specialmethod」和del
方法導致「類型錯誤:‘dict_proxy’對象不支持項目刪除」
基本上許多不同類別將從Foo
繼承,但有些他們不應該有他們可用的具體方法,如C
,它們不應該有specialmethod
可用。
我在做什麼錯?或者我該怎麼做到這一點?
順便說一句:這將違反[里氏替換原則](http://en.wikipedia.org/wiki/Liskov_substitution_principle)。 – pillmuncher