2

今日、異なる名前の基本クラスのメソッドをオーバーライドするメソッドの例を見ましたが、これはどのように、そしてなぜ可能ですか?そして、それはおそらくどのような用途を持つことができますか?

>>> class A(object):
...   def foo(self):
...     self.__bar()
...   def __bar(self):
...     print "original"
... 
>>> class B(A):
...   def _A__bar(self):
...     print "overridden"
... 
>>> B().foo()
overridden
4

2 に答える 2

3

うわー、それは本当にひどいです。

これが機能するのは、二重アンダースコアで始まるメソッド(の__barメソッド)Aが、Pythonで「プライベート」関数をシミュレートする非常に基本的な方法として名前が変更されているためです。ただし、実際にはプライベートではなく、プレフィックスが.であるだけです_classname。したがって、ここでのコーダーはこれを利用して、Aのいわゆるプライベートメソッドをオーバーライドします。

これは機能しますが、絶対に実行しないでください。(実際、とにかく二重アンダースコアのプライベート属性を使用することはほとんどありませんが、それは別の議論です。)

于 2012-06-28T10:22:35.373 に答える
3

これは、クラスがサブクラスの属性と誤って混同されない属性を持つことができるようにするためです。これが必要になることはめったにないので、プレフィックス付きの属性はあまり表示されません__(ほとんどの場合、Javaプログラマーは、Javaプログラマーが、実行しないことを実行すると考えているために、属性を誤用しているのを目にします)。

このコードは、クラスの属性をbashする方法から外れています。Pythonはそれを止めることはありませんが、そのようなコードを書く正当な理由を見つけるのは難しいでしょう。

于 2012-06-28T10:26:29.443 に答える