Python PyCharm中未自动完成的类方法列表

Python PyCharm中未自动完成的类方法列表,python,pycharm,Python,Pycharm,我是python新手,我有一个关于使用Pycharm自动完成列表中对象的方法调用的问题 我有一个名为foo()的类: 然后,我创建一个名为myList的列表,并在其中附加一个foo()对象。由于某种原因,当我尝试调用该对象时,该方法没有出现 但是,如果我使用print(myList[0].getNum())完成代码,它确实会打印出10 另外,如果我简单地创建一个变量x并将其分配给foo()对象,它将显示如下: 我试图创建一个y变量,并将其分配给myList[0]以查看是否可以显示该方法,但仍

我是python新手,我有一个关于使用Pycharm自动完成列表中对象的方法调用的问题

我有一个名为foo()的类:

然后,我创建一个名为
myList
的列表,并在其中附加一个
foo()
对象。由于某种原因,当我尝试调用该对象时,该方法没有出现

但是,如果我使用
print(myList[0].getNum())
完成代码,它确实会打印出10

另外,如果我简单地创建一个变量
x
并将其分配给
foo()
对象,它将显示如下:

我试图创建一个
y
变量,并将其分配给
myList[0]
以查看是否可以显示该方法,但仍然没有成功


这只是一个IDE问题,还是在使用列表中的对象进行方法调用时,我缺少了一个更大的图景。

我很确定这是一个IDE问题,因为在实际运行之前,它可能不会一直跟踪变量到其原始调用。因此,将x直接设置为foo()是一个赋值,但设置y=myList[0],然后在myList[0]获取对象,如果这样做有意义的话,这将是对变量的另一次调用。

我很确定这是一个IDE问题,因为在实际运行之前,它可能不会一直跟踪变量的原始调用。因此,将x直接设置为foo()是一个赋值,但设置y=myList[0],然后在myList[0]处获取对象,这将是对变量的另一个调用,如果这有意义的话。

原因是python具有动态类型。myList不能只包含foo对象。所以PyCharm不知道myList[0]是一个foo,它可以为您提供foo的自动完成功能(只有在运行时才知道)

举个例子:

class foo(object):

    def __init__(self):
        self.num = 10


    def getNum(self):
        return self.num

class bar(object):

    def __init__(self):
        self.num = 10


    def getNum2(self):
        return self.num

myList = []
myList.append(foo())
myList.append(bar())
print(myList[0])
PyCharm不知道是为foo()还是bar()提供自动完成功能,所以它也不提供


关于x的最后一个例子之所以有效,是因为您显式地将x指定为foo对象,因此Pycharm知道并为您提供foo的自动完成功能。

原因是python具有动态类型。myList不能只包含foo对象。所以PyCharm不知道myList[0]是一个foo,它可以为您提供foo的自动完成功能(只有在运行时才知道)

举个例子:

class foo(object):

    def __init__(self):
        self.num = 10


    def getNum(self):
        return self.num

class bar(object):

    def __init__(self):
        self.num = 10


    def getNum2(self):
        return self.num

myList = []
myList.append(foo())
myList.append(bar())
print(myList[0])
PyCharm不知道是为foo()还是bar()提供自动完成功能,所以它也不提供


关于x的最后一个例子之所以有效,是因为您显式地将x指定为foo对象,因此Pycharm知道并为您提供了foo的自动完成功能。

从python 3.5中,您可以使用它提供了Pycharm可以用来建议自动完成的高级键入功能


有关python 3.5的更多信息,请参见示例和
键入
文档,您可以使用它提供pyCharm可用于建议自动完成的高级键入功能


有关更多信息,请参见示例和
键入
文档

@NickWesenman谢谢。这为我消除了许多困惑。我唯一关心的是,如果您的程序规模变得非常大,并且您的类具有大量的方法,该怎么办。唯一的方法是在代码和类之间来回切换,看看其中有什么方法吗?您已经发现了使用动态类型语言的一个缺点。:)是的,我经常在另一个监视器上打开它,如果我必须经常引用它的话。你永远无法像IntelliJ(JetBrains版本的静态类型Java)那样自动完成代码。@NickWesenman谢谢。这为我消除了许多困惑。我唯一关心的是,如果您的程序规模变得非常大,并且您的类具有大量的方法,该怎么办。唯一的方法是在代码和类之间来回切换,看看其中有什么方法吗?您已经发现了使用动态类型语言的一个缺点。:)是的,我经常在另一个监视器上打开它,如果我必须经常引用它的话。您将永远无法获得IntelliJ(JetBrains版本的静态类型Java)提供的自动代码完成功能。感谢您的输入!谢谢你的意见!