1. ホーム
  2. python

[解決済み] Pythonで明示的な'self'を避けるには?

2022-05-02 04:14:37

質問

私はPythonを学ぶために、以下のものを参考にしています。 pygameチュートリアル .

というキーワードが多用されていることがわかりました。 自己 そして、主にJavaのバックグラウンドを持っている私は、このような場合 自己 . 例えば self.rect.centerx 私なら rect.centerx , なぜなら、私にとっては。 直方体 はすでにクラスのメンバ変数です。

この状況に対して私が思いつくJavaの並列処理は、メンバー変数へのすべての参照の前に これ .

すべてのメンバ変数に接頭辞を付けるのは難しいですか? 自己 それとも、そのようなことをしなくても済むような宣言の仕方があるのでしょうか?

私が提案していることが、仮に ピトニック でも、それが可能かどうか、知りたいですね。

関連するSOの質問も見てみましたが、私が求めているものには全く答えられません。

解決するには?

Pythonではselfを指定する必要があります。 その結果、クラスの完全な定義が表示されていなくても、何がメンバーで何がメンバーでないかで混乱することはないのです。 このことは、例えば、非メンバーをシャドウするようなメンバーを追加して、それによってコードが壊れるようなことがない、というような有用な特性につながっています。

極端な例ですが、どのようなベースクラスがあるか全く知らずにクラスを書くことができ、メンバーにアクセスしているかどうかが常に分かります。

class A(some_function()):
  def f(self):
    self.member = 42
    self.method()

それが、この コンプリート のコードです! (some_functionはベースとして使用される型を返します)。

もうひとつは、クラスのメソッドが動的に構成されるものです。

class B(object):
  pass

print B()
# <__main__.B object at 0xb7e4082c>

def B_init(self):
  self.answer = 42
def B_str(self):
  return "<The answer is %s.>" % self.answer
# notice these functions require no knowledge of the actual class
# how hard are they to read and realize that "members" are used?

B.__init__ = B_init
B.__str__ = B_str

print B()
# <The answer is 42.>

これらの例はいずれも極端なもので、日常的に目にすることはありませんし、このようなコードを頻繁に書けというわけではありません。