1

Python での関数と自己パラメータの定義について質問があります。

以下のコードがあります。

class Dictionaries(object):
    __CSVDescription = ["ID", "States", "FilterTime", "Reaction", "DTC", "ActiveDischarge"]

    def __makeDict(Lst):
        return dict(zip(Lst, range(len(Lst))))

    def getDict(self):
        return self.__makeDict(self.__CSVDescription)

    CSVDescription = __makeDict(__CSVDescription)

x = Dictionaries()
print x.CSVDescription
print x.getDict()

x.CSVDescription正常に動作します。しかしprint x.getDict()、エラーを返します。

TypeError: __makeDict() takes exactly 1 argument (2 given)

メソッドにself- パラメータを追加できますが、機能しません。__makeDict()print x.CSVDescription

self- パラメータを正しく使用するにはどうすればよいですか?

4

2 に答える 2

6

Python では、selfメソッドが で装飾されていない限り、パラメーターは暗黙的にインスタンス メソッドに渡されます@staticmethod

この場合、__makeDictオブジェクト自体への参照は必要ないため、静的メソッドにすることができるため、次を省略できますself

@staticmethod
def __makeDict(Lst): # ...

def getDict(self):
    return self.__makeDict(self.__CSVDescription)
于 2012-07-25T06:11:12.823 に答える
3

@staticmethodクラス本体自体からメソッドを呼び出しても記述子プロトコルが呼び出されないため、使用するソリューションはここでは機能しません (通常のメソッドが記述子である場合、これは通常のメソッドでも問題になりますが、クラスの後まではそうではありません定義がコンパイルされています)。ここには 4 つの主要なオプションがありますが、それらのほとんどは何らかのレベルのコードの難読化と見なされる可能性があり、「なぜ単に a を使用しないのstaticmethodですか?」という質問に答えるにはコメントが必要です。

1つ目は、@Marcusが示唆するように、インスタンスからではなく、常にクラスからメソッドを呼び出すことです。つまり、あなたがするたびにself.__makeDictself.__class__.__makeDict代わりにします。これは奇妙なことなので、奇妙に見えます。Pythonでは、メソッドを as として呼び出す必要はほとんどありませClass.methodん。superself.__class__

同様に、しかし逆に、それを astaticmethodにして、クラス本体で記述子プロトコルを手動で呼び出すことができます - do: __makeDict.__get__(None, Dictionaries)(__lst)

または、オプションの引数を工夫することで、どのコンテキストから呼び出されているかを自分で検出できます。

def __makeDict(self, Lst=None):
    if Lst is None:
       Lst = self
    ...

しかし、最善の方法は、Java ではなく Python で作業していることを認識し、クラスの外に置くことです。

def _makeDict(Lst):
    ...

class Dictionaries(object):
   def getDict(self):
      return _makeDict(self.__CSVDescription)

   CSVDescription = _makeDict(__CSVDescription)
于 2012-07-25T08:00:57.517 に答える