LoginSignup
0
0

Pythonだとクラス全体をスコープとする変数をメソッド内で定義できる?

Last updated at Posted at 2024-01-21

ゆるコンピュータ科学ラジオ、というYoutubeのチャンネルがありまして。
その「プログラミングの基礎を習得したので、相方botを制作してみる」という回に
関連した記事です。(以下、動画の視聴後にお読みいただければと思います)

で、そのコメント欄で、以下の指摘が挙がっていました。

24:48の「1回目なら○○、2回目以降なら××」という処理について、
パーソナリティは「できる」と言っているが、これは「できない」はず。
(環境変数に回数を保持する等の、現実的でない方法を想定しない限りは)

私も、まあ、おおむねそうかな、とは思ったのですが、手元のPython環境で
以下を試したら「1回目の返事」「2回目以降の返事」と順に出力されまして。

Test.py
class Test () :
    def 実行時プログラム(self):
        self.sendButtonWasCliecked = False

    def 送信時プログラム(self):
        if not self.sendButtonWasCliecked :
            print("1回目の返事")
            self.sendButtonWasCliecked  = True
        else:
            print("2回目以降の返事")

test = Test()
test.実行時プログラム()
test.送信時プログラム()
test.送信時プログラム()

ということは、「self.」(Java等のthisに近い?)の使用で目的の動作ができそうかな、と。
実行時プログラムと送信時プログラムは、同じクラスに属していそうなので。

まあ、この辺りは、まんま脆弱性になりそうなので、
環境側でサニタイズ(ブロック)されてる可能性も高いのですが。

にしても、プログラムは専門ではないのでよくわからないのですが
メソッドからクラス変数インスタンス変数を定義するこのやり方には、
強烈に違和感を覚えます。
自身のスコープを超えた変数を定義しているように見えるので。

これ、最近の言語では割と普通のことなのでしょうか…?
そんなこと、ないですよね…?

とりあえず、試してみてビックリだったので、メモをかねて記事にしてみました。

追記

コメント欄に識者の方からコメントをいただくことができました。
ざっくりとは以下になるかと思います。詳細はコメント欄をご確認ください。

  • メソッドからインスタンス変数を作成することは可能だし、普通に行う
  • 共通で使用する変数が冒頭で宣言されない点に違和感があるなら、コンストラクタで定義(+初期化)すればよい
0
0
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0