首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >约束方法对接口的访问?

约束方法对接口的访问?
EN

Stack Overflow用户
提问于 2012-08-23 08:51:57
回答 2查看 86关注 0票数 0

我有一个Python系统,由大约9-10个类组成,所有这些类都实现了胖鸭子类型的大多数接口,并且可以通过大量的模块集合来交互使用。在职责分离之后,我试图将类重构为一个核心、显式(即ABC)接口和外围功能,但为了做到这一点,我需要能够判断消费者模块何时调用核心接口之外的方法。

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

代码语言:javascript
运行
复制
from abc import ABCMeta, abstractmethod

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

我还有一个类实现了这些抽象方法以及其他方法:

代码语言:javascript
运行
复制
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中是否有某种包装器可以类似地限制方法访问?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-30 10:09:23

这就是我想出来的:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2012-08-23 09:01:01

简短而简单的回答:否

Python中没有私有方法/变量的概念,正如这里在详细信息中所描述的那样。

在Python中,这是由约定提供的。

如果您真的想深入了解内部结构,请查看这个线程

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12088047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档