【发布时间】:2011-10-05 08:20:44
【问题描述】:
代码如下,只是基本结构:
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 的__dict__ 中删除该方法。我试过的方法是delattr(instance, 'specialmethod')和del instance.__dict__['specialmethod']。
delattr 方法导致“AttributeError: specialmethod”,del 方法导致“TypeError: 'dict_proxy' 对象不支持删除项目”
基本上许多不同的类都将继承自Foo,但其中一些不应该有特定的方法可供它们使用,例如C 不应该有specialmethod 可用。
我做错了什么?或者我还能如何做到这一点?
【问题讨论】:
-
顺便说一句:这将违反Liskov Substitution Principle。
标签: python inheritance metaclass