Python类:函数或实例方法

时间:2018-04-02 20:35:50

标签: python python-3.x class instance-methods

我使用一本名为计算和使用Python编程的简介的教科书学习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编写。

1 个答案:

答案 0 :(得分:1)

这两种差异主要是因为您所关注的书已被编写为随后使用python2.x。如果您测试了该书的代码,请使用python2.7.x,您将获得完全相同的书籍输出:

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

事实上,如果你的类不会从对象继承并且它被定义为class IntSet:,那么在使用python2.7.x时你得到以下输出:

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

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

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

这主要是因为python3使用new-style classes,所以你的类是否继承自object并不重要,它仍然是 new-style < / em> class。此外,如果您打算使用代码,则从对象继承被认为是一种很好的做法 与python2和python3一起运行。

所以是的,你没有错,只是python2和python3之间的区别之一。

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