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 也可以进一步澄清你的问题。
我正在学习 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 也可以进一步澄清你的问题。