質問

C ++では、子クラスでprivateとして宣言することにより、親のクラスの関数を無効にできます。これをPythonでどのように行うことができますか? I.E.子のパブリックインターフェイスから親の機能を非表示にするにはどうすればよいですか?

役に立ちましたか?

解決

本当の「プライベート」はありません。 Pythonの属性またはメソッド。できることの1つは、サブクラスで不要なメソッドをオーバーライドし、例外を発生させることです。

>>> class Foo( object ):
...     def foo( self ):
...         print 'FOO!'
...         
>>> class Bar( Foo ):
...     def foo( self ):
...         raise AttributeError( "'Bar' object has no attribute 'foo'" )
...     
>>> b = Bar()
>>> b.foo()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "<interactive input>", line 3, in foo
AttributeError: 'Bar' object has no attribute 'foo'

他のヒント

AttributeError を取得せずに b.foo を引き続き使用できるため、

kuroschの問題解決方法はあまり正確ではありません。関数を呼び出さない場合、エラーは発生しません。これを行うには、次の2つの方法が考えられます。

import doctest

class Foo(object):
    """
    >>> Foo().foo()
    foo
    """
    def foo(self): print 'foo'
    def fu(self): print 'fu'

class Bar(object):
    """
    >>> b = Bar()
    >>> b.foo()
    Traceback (most recent call last):
    ...
    AttributeError
    >>> hasattr(b, 'foo')
    False
    >>> hasattr(b, 'fu')
    True
    """
    def __init__(self): self._wrapped = Foo()

    def __getattr__(self, attr_name):
        if attr_name == 'foo': raise AttributeError
        return getattr(self._wrapped, attr_name)

class Baz(Foo):
    """
    >>> b = Baz()
    >>> b.foo() # doctest: +ELLIPSIS
    Traceback (most recent call last):
    ...
    AttributeError...
    >>> hasattr(b, 'foo')
    False
    >>> hasattr(b, 'fu')
    True
    """
    foo = property()

if __name__ == '__main__':
    doctest.testmod()

バーは&quot; wrap&quot;を使用しますラップされたオブジェクトへのアクセスを制限するパターン。 Martelliがこれに対処している。 Bazはビルトインプロパティを使用して記述子プロトコルを実装しますオーバーライドする属性。

kuroschの答えのバリエーション:

class Foo( object ):
    def foo( self ):
        print 'FOO!'

class Bar( Foo ):
    @property
    def foo( self ):
        raise AttributeError( "'Bar' object has no attribute 'foo'" )

b = Bar()
b.foo

これにより、メソッドが呼び出されたときではなく、プロパティで AttributeError が発生します。

コメントで提案しましたが、残念ながらまだ評判がありません。

class X(object):
    def some_function(self):
        do_some_stuff()

class Y(object):
    some_function = None

これにより、いくつかの厄介で見つけにくい例外がスローされる可能性があるため、これを試してください:

class X(object):
    def some_function(self):
        do_some_stuff()

class Y(object):
    def some_function(self):
        raise NotImplementedError("function some_function not implemented")

これは、私が知っている最もクリーンな方法です。

メソッドをオーバーライドし、オーバーライドされた各メソッドがdisabledmethods()メソッドを呼び出すようにします。このように:

class Deck(list):
...
@staticmethod
    def disabledmethods():
        raise Exception('Function Disabled')
    def pop(self): Deck.disabledmethods()
    def sort(self): Deck.disabledmethods()
    def reverse(self): Deck.disabledmethods()
    def __setitem__(self, loc, val): Deck.disabledmethods()

それはさらに簡単かもしれません。

@property
def private(self):
    raise AttributeError

class A:
    def __init__(self):
        pass
    def hello(self):
        print("Hello World")

class B(A):
    hello = private # that short, really
    def hi(self):
        A.hello(self)

obj = A()
obj.hello()
obj = B()
obj.hi() # works
obj.hello() # raises AttributeError
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top