こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Pythonのコードself多すぎ読み書きしにくい

Pythonのクラスには通常class:宣言行直下で作成する「クラス変数」と、__init__()メソッド内で作成するかインスタンス作成後にインスタンス名.変数名で追加作成する「インスタンス変数」があります。

Pythonのクラス変数はJavaのクラスでstatic修飾子を付けて宣言したクラス変数と同じで、そのクラスから作成されたインスタンス全てに同じメモリーを割り当てます。

Pythonのインスタンス変数はインスタンスごとにメモリーが割り当てられるので、Javaの普通の変数(フィールド)のように同一クラス内のすべてのメソッドから参照できますが、参照するたびにいちいち「self.」を付けないといけません。

(例 かなり恣意的ですが。。。インデントはOKWAVEが取ってしまうかもしれせん)
class Sample:
def __init__(self):
self.L = [] # Lは数値のリスト
def setList(self, L):
self.L = L
def exe(self, i1, i2): # L[i1]>0かつL[i2]>0のとき、大きい方から小さい方を引いた
# 値に、大きい方を小さい方で累乗した値を加える
if self.L[i1] > 0 and self.L[i2]:
if self.L[i1] > self.L[i2]:
return (self.L[i1] - self.L[i2]) + self.L[i1] ** self.L[i2]
else:
return (self.L[i2] - self.L[i1]) + self.L[i2] ** self.L[i1]

イテレーターを使て同じ処理をループする場合はいいのですが、ループで処理できない複雑な処理が続く場合はこのように「self」だらけになり、コーディングミスが多発し、コードが読みにくいものになります。

「self」を省略してインスタンス変数をメソッドから参照し、コードを読みやすいものにする手段はないのでしょうか?

どうぞよろしくお願いします。

投稿日時 - 2019-10-12 13:02:15

QNo.9666285

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

私が知る限りないです。

投稿日時 - 2019-10-12 13:47:08

補足

メソッド内で、インスタンス変数を参照する変数に代入して使えば、self.を付けずにインスタンス変数を読むことができるので、この方法でコードが読みやすくなることがわかりました。

ただし参照のための変数に何らかの変更を行った場合、インスタンス変数がどのようなオブジェクトか(intなのかListなのかなど)によって、新しいオブジェクトが作られて参照のための変数がそちらを参照する場合があります。新しいオブジェクトが作られる場合は、この方法を使わないか、参照のための変数をインスタンス変数に代入して戻してからメッソドを終わるかなどしなければいけません。

質問に書いたコードのexe()メソッドで、self.を省略したコード:

class Sample:
def __init__(self):
self.L = [] # Lは数値のリスト
def setList(self, L):
self.L = L
def exe(self, i1, i2): # L[i1]>0かつL[i2]>0のとき、大きい方から小さい方を引いた
# 値に、大きい方を小さい方で累乗した値を加える
sL = self.L # self.LをsLで参照する。sLを変更しないので安全。
if sL[i1] > 0 and sL[i2]:
if sL[i1] > sL[i2]:
return (sL[i1] - sL[i2]) + sL[i1] ** sL[i2]
else:
return (sL[i2] - sL[i1]) + sL[i2] ** sL[i1]

実行結果:

>>> import sample
>>> samp = sample.Sample()
>>> samp.setList([0,1,2,3,4])
>>> samp.L
[0, 1, 2, 3, 4]
>>> samp.exe(1,3)
5
>>> samp.exe(4,2)
18

投稿日時 - 2019-10-14 14:37:06