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-parameter 添加到__makeDict()方法中,但随后print x.CSVDescription将不起作用。

如何self正确使用 -parameter?

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在这里不起作用,因为从类主体本身调用方法不会调用描述符协议(如果它们是描述符,这对于普通方法来说也是一个问题 - 但直到类之后才会出现这种情况定义已编译)。这里有四个主要选项 - 但其中大多数可以被视为某种程度的代码混淆,并且确实需要注释来回答“为什么不只使用staticmethod?”的问题。

第一个是,正如@Marcus 建议的那样,总是从类中调用方法,而不是从实例中调用。也就是说,每次你会做self.__makeDict,做self.__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
    ...

但是,到目前为止,最好的方法是意识到你正在使用 Python 而不是 Java——把它放在课堂之外。

def _makeDict(Lst):
    ...

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

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