2016-06-12 3 views
-1

クラスの中で、ある引数を持つメソッドを作成したい場合は、ある変数self.を作成します。例えば自己変数を引数として持つクラスの中で関数を作成する(Python)

hereから取られたいくつかのコードが)、私はget_results内のすべての和から繰り返しコードを回避し、これらの和を処理するために、別のクラスのメソッドを作成しようとしています、私は

class Summations(object): 
    dct = {'A': 11, 'B': 4, 'C': 7, 'D': 12, 'E': 5, 'L': 2, 'M': 0, 'Z': 9} 

    f_lst = ['A', 'B', 'C', 'D', 'E', 'F', 'G'] 
    s_lst = ['H', 'I', 'J'] 
    t_lst = ['K', 'L', 'M', 'N'] 

    def get_results(self): 
     # Sum each of the dictionary's values provided their corresponding keys exist in a specified list. 

     f_sum = sum(self.dct.get(k, 0) for k in self.f_lst) 
     s_sum= sum(self.dct.get(k, 0) for k in self.s_lst) 
     t_sum= sum(self.dct.get(k, 0) for k in self.t_lst) 

を持っていることを言います、このような何か:

def do_sums(self, d, l): 
    return sum(self.d(k, 0) for k in self.l) 

do_sumsがそのように

よう get_results内部で呼び出されてい

これは何か(クラッセの方法で引数として使用されるクラスの自己変数)でも可能ですか?そして、そうなら、構文はどのように見えますか?

+1

私は考え構造化されたOOP Pythonチュートリアルに従うことをお勧めします。あなたはどこにでも「自己」を投げつけず、ベストを願っています!構築しているオブジェクトの*属性*について、そのメソッドの*パラメータ*として渡す必要があるものについて考えてください。 – jonrsharpe

+0

@jonrsharpe私はあなたが何を意味しているのか理解しています。しかし、私はプログラミングとPythonの初心者であるため、私はいくつかの指針とヒントを得ることができた唯一の方法でした。 –

答えて

2

getattr()を使用すると、属性に動的にアクセスできます。

def do_sums(self, d, l): 
    return sum(getattr(self, d).get(k, 0) for k in getattr(self, l)) 

に渡します:渡す必要はありません

f_sum = self.do_sums('dct', 'f_lst') 
s_sum = self.do_sums('dct', 's_lst') 
t_sum = self.do_sums('dct', 't_lst') 

の属性(ここではself)と属性の名前の文字列を検索するオブジェクトを与えますselfself.do_sums()はバインドされたメソッドです。

しかし、あなたがメソッドを呼び出すときにあなただけの直接オブジェクトを渡すことができるように、あなたはすでに、あなたの属性を知っている:

def do_sums(self, d, l): 
    return sum(d.get(k, 0) for k in l) 

をしてself.dctし、リストのオブジェクトを渡す:

f_sum = self.do_sums(self.dct, self.f_lst) 
s_sum = self.do_sums(self.dct, self.s_lst) 
t_sum = self.do_sums(self.dct, self.t_lst) 
+0

優秀な説明!それだけでなく、アプローチやプログラミングのスキルの欠点も強調しています。ありがとうございます –

+0

小さなフォローアップの質問; 'do_sums'メソッドを使用せず、実装しているように実装するのと比較して、' do_sums'を使って 'self.dct'とリストオブジェクト(2番目の提案)を渡すことが効率とコードの重複の点で優れていると思いますか?私の最初のコードブロックで? –

+0

@ nk-fford: 'do_sums'関数がかなり小さいので、ここではそれほど大きな違いはありません。 –

関連する問題