2012-08-23 69 views
0

我有一个由大约9-10个类组成的Python系统,所有类都实现了大多数胖鸭式界面,并且可以通过大量模块交换使用。我试图在责任分离后将类重构为核心的显式(即ABC)接口和外设功能,但为了做到这一点,我需要能够告诉消费者模块何时在核心外调用方法接口。限制方法访问接口?

假设我有一个ABC与抽象方法:

from abc import ABCMeta, abstractmethod 

class MyABC: 
    __metaclass__ = ABCMeta 
    @abstractmethod 
    def foo(self): 
     pass 

我也有实现这些抽象方法,以及其他方法:

class MyClass(MyABC): 
    def foo(self): 
     pass 
    def bar(self): 
     pass 

instance = MyClass() 

>>> isinstance(instance, MyABC) 
True 

我怎么能保证当我通过instance改为方法do_something它只有只有使用的方法是MyABC(在这种情况下为foo)的一部分,而不是任何其他方法(bar)?在静态类型语言(如C++)中,我可以通过do_something ABC类型的指针; Python中是否有某种包装器可以类似地限制方法访问?

回答

0

这是我想出了:

class ABCGuard(object): 
    def __init__(self, obj, *abcs): 
     if any(not isinstance(obj, abc) for abc in abcs): 
      raise ValueError("{0} must implement {1}" 
          .format(obj.__class__.__name__, 
            ', '.join(abc.__name__ for abc in abcs 
               if not isinstance(obj, abc)))) 
     self.__obj = obj 
     self.__abcs = abcs 
     classname = '{0}{{{1}}}'.format(obj.__class__.__name__, 
             ', '.join(abc.__name__ for abc in abcs)) 
     self.__class__ = type(classname, (ABCGuard,) + abcs, {}) 

    def __getattribute__(self, name): 
     if name.startswith('_ABCGuard__') or (name.startswith('__') and 
               name.endswith('__')): 
      return super(ABCGuard, self).__getattribute__(name) 
     elif any(name in abc.__abstractmethods__ for abc in self.__abcs): 
      return getattr(self.__obj, name) 
     else: 
      raise AttributeError("%r object has no attribute %r" % 
           (self.__class__.__name__, name)) 

    def __dir__(self): 
     return [x for abc in self.__abcs for x in abc.__abstractmethods__] 
0

简短的回答:没有

没有在Python将被强制执行,如detail这里描述的私有方法/变量的概念。

在Python中,这是由convention handeld。

如果你真的想深入内部结账这thread