5

一段代码有效,我不明白为什么。根据我的理解,它不应该起作用。问题在下面很容易说明:

“主要.py”

from x import * #class x is defined
from y import * #class y is defined


xTypeObj = x()
yTypeObj = y()
yTypeObj.func(xTypeObj)

“x.py”

class x(object):

    def __init__...
        ...
    def functionThatReturnsAString(self):
        return "blah"

“y.py”

#NO IMPORT STATEMENT NEEDED?? WHY

class y(object):
    def __init__...
        ...
    def func(self, objOfTypeX):
        print(objOfTypeX.functionThatReturnsAString())

我的问题是为什么我不需要在“y.py”类型的导入语句

from x import functionThatReturnAString()

它如何确定如何调用此方法?

4

3 回答 3

9

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

functionThatReturnsAString函数是一个类的方法,并且objOfTypeX是该类的一个实例。一个类的实例带有它的类的所有方法。

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

>>> alist = []
>>> alist.append(1)
>>> alist
[1]

该类list有一个.append()方法,您无需导入该方法即可调用它。您所需要的只是对列表实例的引用。

从技术上讲,pythonlist是一种type,但这种区别在这里并不重要。就本次讨论而言,总体而言,类型与类是相同的东西。

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

于 2012-11-13T17:49:41.987 回答
3

Python 是一种动态类型语言。与 C++ 和 Java 等静态类型语言不同,对方法的调用在实际执行之前不会被绑定,因此为什么在定义该方法的情况下导入模块是不必要的。这有几个含义:

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

Note that this is not an exhaustive list of all of the difference between dynamically typed langauges and statically types languages.

于 2012-11-13T17:58:43.847 回答
1

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

于 2012-11-13T17:47:25.673 回答