selfがある変数とない変数の違い(self)


概要


クラス定義中のコンストラクタや関数の中で

self.変数

で定義した変数は
そのクラス(インスタンス)中どこでも使える

クラス定義中のコンストラクタや関数の中で

変数

のようにselfを使わずに定義した変数は
そのコンストラクタや関数の中でしか使えない


class aClass():
    def Func1(self,file):
        self.file = file
        print(self.file)

    def Func2(self,file):
        print(self.file)

ob01 = aClass()

file = '01.txt'
ob01.Func1(file)

file = '02.txt'
ob01.Func2(file)

###########################

class bClass():
    def Func1(self,file):
        print(file)

    def Func2(self,file):
        print(file)

ob02 = bClass()

file = '03.txt'
ob02.Func1(file)

file = '04.txt'
ob02.Func2(file)


aClassというクラスを定義
  Func1という関数を定義(引数はfile)
    self.fileという変数にfileを入れる
    self.fileを出力せよ

    Func2という関数を定義(引数はfile)
    self.fileを出力せよ

クラスaClassのob01というインスタンスを定義

fileという変数に「01.txt」という文字列を入れる
ob01のFunc1を引数fileで実行

fileという変数に「02.txt」という文字列を入れる
ob01のFunc2を引数fileで実行



bClassというクラスを定義
  Func1という関数を定義(引数はfile)
    fileを出力せよ

    Func2という関数を定義(引数はfile)
    fileを出力せよ

クラスbClassのob02というインスタンスを定義

fileという変数に「03.txt」という文字列を入れる
ob02のFunc1を引数fileで実行

fileという変数に「04.txt」という文字列を入れる
ob02のFunc2を引数fileで実行

出力


01.txt
01.txt
03.txt
04.txt

説明


##################で分けた上のほう(aClass)のFunc1では
変数にselfをつけて定義している

##################で分けた下のほう(bClass)のFunc1では
変数にselfなしで定義している

aClassではFunc1でself.fileが定義されているので
インスタンスob01.Func1(file)を定義したときに
self.fileに01.txtが入っている

ob01.Func2(file)をしたときにself.fileを出力したので
01.txtが出てしまっている

Func1で定義したものがFunc2で出ているのだが
このように複数の関数の引数で同じもの(file)を使ってしまうと
self.fileがどこの関数で定義されたものかわからず
混乱して使いづらい

下のbClassではself.fileを使っておらずfileしか使っていないので
file変数はほかの関数には干渉せず
ob02.Func1(file)では直前に入れた03.txtが
ob02.Func2(file)では直前に入れた04.txtが
そのまま出てくるのでわかりやすい

したがって、必要がない限りは
クラスの関数定義中にself.変数は使わないほうがよく
self.変数はできるだけコンストラクタ中のみで定義したほうが
混乱しなくてわかりやすい

間違えやすい問題