Класс Python: метод функции или экземпляра
Я изучаю 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'>
Проведя исследование, я выяснил, что метод instance instance отличается от функции по ряду причин. Кроме того, мой Jupyter Notebook работает под управлением Python3, но мой учебник является более старой версией, написанной на Python2.
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 использует классы нового стиля, поэтому не имеет значения, наследует ли ваш класс объект или нет, это все равно класс нового стиля. Кроме того, наследование от объекта считается хорошей практикой, если вы планируете запускать код как с python2, так и с python3.
Так что да, с вашей стороны все в порядке, только одно из различий между python2 и python3.
NS: Этот https://wiki.python.org/moin/FromFunctionToMethod также может немного прояснить ваш вопрос.