Python Class: 函数或实例方法

Python Class: function or instance method

我正在学习 Python 一本名为 Introduction to Computation and Programming Using Python 的教科书,在第 8 章中有一个示例代码:

class IntSet(object):
    """An intSet is a set of integers"""
    # Information about the implementation (not the abstraction)
    # The value of the set is represented by a list of ints, self.vals.
    # Each int in the set occurs in self.vals exactly once.

    def __init__(self):
        """Create and empty set of integers"""
        self.vals == []

    def insert(self, e):
        """Assumes e is an integer and inserts e into self"""
        if not e in self.vals:
            self.vals.append(e)

    """I've omitted this part of the example code"""

    def __str__(self):
        """Returns a string representation of self"""
        self.vals.sort()
        result = ''
        for e in self.vals:
            result = result + str(e) + ','
        return '{' + result[:-1] + '}' # -1 omits trailing comma

教科书说输入时:

print(type(IntSet), type(IntSet.insert))

将打印:

<type 'type'> <type 'instancemethod'>

然而我的打印:

<class 'type'> <class 'function'>

经过研究,我发现类型 instancemethod 因边界原因而不同于函数。另外,我的 Jupyter Notebook 是 运行 Python3,但我的教科书是用 Python2.

编写的旧版本

这两个差异主要是因为您所关注的书是为了让 python2.x 支持您而编写的。如果你用 python2.7.x 测试了那本书的代码,你会得到完全相同的书的输出:

(<type 'type'>, <type 'instancemethod'>)

事实上,如果您的 class 不会从对象继承并且它被定义为 class IntSet: 您在使用 python2.[=32= 时会得到以下输出]:

(<type 'classobj'>, <type 'instancemethod'>)

而如果你使用 python 3.6.x,无论你是否从对象继承,你都会得到:

<class 'type'> <class 'function'>

这主要是因为python3使用了new-style classes,所以不管你的class是否继承自object,它仍然是一个new-styleclass。此外,如果您打算编写代码,则从对象继承被认为是一种很好的做法 运行 python2 和 python3.

所以是的,您这边没有问题,只是 python2 和 python3 之间的差异之一。

NS:这个 https://wiki.python.org/moin/FromFunctionToMethod 也可以进一步澄清你的问题。