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に渡すときに(この場合は )の一部であるメソッドのみを使用し、他のメソッド ( ) を使用しないようにするにはどうすればよいですか? 静的型付け言語 (C++ など) では、ABC 型のポインターを渡すことができました。メソッドへのアクセスを同様に制限するPythonで利用可能なある種のラッパーはありますか?MyABCfoobardo_something

4

2 に答える 2

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__]
于 2012-08-30T10:09:23.130 に答える
0

簡潔で簡単な答え: いいえ

ここで詳細に説明されているように、Python には強制されるプライベート メソッド/変数の概念はありません。

Python では、これは慣例により処理されます

そして、あなたが本当に深い内部に行きたいなら、このスレッドをチェックアウトしてください。

于 2012-08-23T09:01:01.833 に答える