我使用一本名为计算和使用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编写。
答案 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也可以进一步澄清你的问题。