2017-01-13 12 views
1

私は非常にいくつかのパラメータとメソッドを持つクラスを持つpythonプロジェクトに取り組んでいます。複雑さを軽減するために、私はそのようなメソッドを記述しています:Python:クラスメソッドまたは引数に自己を渡す

def foo(self): 
    return self.parameter1 * self.parameter2 

明示的にパラメータを渡す方が良いでしょうか?

def foo(self, parameter1, parameter2): 
    return parameter1 * parameter2 

これは、クラス全体のテストをしなくても、クラス内の関数をテストするのが難しいことがわかったためです。

+0

[mcve]を作成します。 – MYGz

+2

あなたのメソッドが 'self'を使用しない場合、それをクラスに入れる理由はありますか?私はあなたがあなたのクラスにあらゆる種類のデータを無制限に置くことを主張しているわけではないこと、あるいはあなたのクラスが国家管理の悪夢のようなものになってしまったことを主張しているわけではないことに注意してください...基本的には、 – mgilson

+0

@MYGz申し訳ありませんが、私の質問が欠けていたことを認識していませんでした..メソッドだけでなく、2つのサンプルクラスを書く方が良いでしょうか? –

答えて

1

複雑さを軽減するために、私は方法を書いてきたように

として、この目的の仮定が間違っているあなたは、インスタンスメソッドを定義する場合、自己(インスタンス変数)を使用することを想定しています。

pylint: method_could_be_a_functionに従って:関数が自己(インスタンス変数)なしで実行できる場合は、インスタンスメソッドではなく個別の関数でなければなりません。例えば

class A(object): 

    def __init__(self): 
     self.some_instance_var 

    def some_instance_method(self): 
     #code here is suggested to be related to self(instance variable), eg: 
     return self.some_instance_var 

この1つは、インスタンスメソッドとしてクラスに置くことが適切であろう。

class A(object): 

    ... 

    def foo(self): 
     return self.parameter1 * self.parameter2 

これはインスタンスメソッドではなく、通常の関数である必要があります。関数の内容は自己(インスタンス変数)に関係しないためです。

def foo(self, parameter1, parameter2): 
    return parameter1 * parameter2 
+0

すばやく明確な答えをいただきありがとうございます。私はpythonがmethod_could_be_a_functionエラーを発生させることに気付かなかった。 –

+0

pylintは、Googleが推奨するツールで、コードをきれいに整えます。詳細は[こちら](https://pylint.readthedocs.io/en/latest/)をご覧ください。 –

0

あなたの質問は、オブジェクト指向設計と一致しないいくつかの前提があります。

parameter1の場合とparameter2は、彼らが通過する必要がある、selfによって表されるオブジェクトの固有の特性ではありません。ただし、の固有プロパティーである場合は、selfと関連付けられていて、渡される必要はありません。

オブジェクト指向設計の主要点の1つは、オブジェクトを記述するデータとオブジェクトを処理するメソッドを明示的に関連付けることです。

回答:

オブジェクトに固有である何のためself基準を使用して、パラメータとしてではないこれらの値を渡します。