我们什么时候需要Python导入语句?

我们什么时候需要Python导入语句?,python,python-import,Python,Python Import,一段代码可以工作,但我不明白为什么。从我的理解来看,它不应该起作用。下面很容易说明这个问题: “Main.py” “x.py” “y.py” 我的问题是,为什么不需要在类型为“y.py”的 from x import functionThatReturnAString() 它如何计算如何调用此方法?函数yTypeObj.func是从导入类的main.py处调用的。因此,可以构造对象并将其传递给函数及其所有方法(functionthattreturnastring是objOfTypeX的方法)。

一段代码可以工作,但我不明白为什么。从我的理解来看,它不应该起作用。下面很容易说明这个问题:

“Main.py”

“x.py”

“y.py”

我的问题是,为什么不需要在类型为“y.py”的

from x import functionThatReturnAString()

它如何计算如何调用此方法?

函数
yTypeObj.func
是从导入类的
main.py
处调用的。因此,可以构造对象并将其传递给函数及其所有方法(
functionthattreturnastring
objOfTypeX
的方法)。

Python是一种面向对象的编程语言。在这种语言中,值就是对象,对象可以有方法

返回字符串的
函数是类上的一个方法,
objOfTypeX
是该类的一个实例。一个类的实例携带它的类的所有方法

例如,这就是为什么python中的
list
对象有一个
.append()
方法:

>>> alist = []
>>> alist.append(1)
>>> alist
[1]
列表
类有一个
.append()
方法,您不需要导入该方法就可以调用它。您所需要的只是对列表实例的引用

从技术上讲,python
list
是一种类型,但这种区别在这里并不重要。总的来说,在本次讨论中,类型与类是一样的


请务必阅读,它在后面的一章中解释了类(但您可能想先浏览第一组章节)。

Python是一种动态类型语言。与静态类型语言不同,如C++和java调用,直到实际执行时,方法才被绑定,因此为什么不导入该方法是不需要定义的方法。这有几个含义:

  • 方法(和数据成员)可以在运行时添加到实例中或从实例中删除,因此类Foo的两个实例实际上可以具有不同的方法,即使它们是相同类型的
  • 方法(和数据成员)可以在运行时添加到类中或从类中删除,这将影响所有当前实例以及新实例
  • 基类可以在运行时添加和删除到类中

  • 请注意,这并不是动态类型语言和静态类型语言之间所有差异的详尽列表。

    您谈论类并调用一些方法,但您的模块只定义函数,而不是类和方法#Confusion你真的想研究,尤其是。你把它作为一个参数传入了。@Fredrarson:这在这里没有什么区别。。你认为你自己会发生什么?@MartijnPieters:只是一个想法。现在我仔细看了一下,我知道你是对的。所以我真的不明白什么时候需要进口。不在任何调用另一个类的方法的类中,因为y调用x的函数。当您要定义新对象时,需要导入该类(或任何其他属性)。否则,您将没有构造新对象的配方。您可以将对象传递给您喜欢的任何函数(它不必知道这样一个类的存在)。您的回答好像我比我更无知。问题不在于“面向对象”,我知道类的实例是什么。。。。我来自C++世界。问题来自“动态与静态类型”。在C++中,在Y.Py中,您必须包括一个提供ObjopType的签名的函数。函数是RealStAsTrn(),否则在编译时它会说“ObjopType没有命名方法……”。在python中,我想它会在运行时寻找这个方法,否则会抛出一个错误。你的答案没有触及这个问题,所以我接受另一个。也就是说,我不知道为什么函数()不需要被告知,方法函数ReutsAsStutter()实际上存在,因为你必须通过告诉yPy这个函数确实存在,在C++中“证明”。我不知道python不需要这样的证明,只是在运行时轰炸说“这个函数不像你说的那样存在”。@Tommy:公平地说,你的问题根本不清楚这一点。一些你期望事情如何运作的指示将有助于让事情变得更清楚。@Tommy:而且也要说清楚:很高兴你找到了一个对你有帮助的答案!这就是问题所在,Josh Heitzman认识到了你的问题所在,这是他应得的荣誉。:-)我的评论“#不需要IMPORT语句??为什么”和“from x IMPORT function that returnastring()”意味着我不明白为什么我不需要像在其他OO语言(如C++/Java)中那样通知y.py这个函数的存在。“不同于静态类型的语言,如C++和java调用,直到方法被执行之前才被绑定,因此为什么导入模块是不需要定义的方法”——正是我要找的答案。谢谢!
    #NO IMPORT STATEMENT NEEDED?? WHY
    
    class y(object):
        def __init__...
            ...
        def func(self, objOfTypeX):
            print(objOfTypeX.functionThatReturnsAString())
    
    from x import functionThatReturnAString()
    
    >>> alist = []
    >>> alist.append(1)
    >>> alist
    [1]