Метод isinstance () возвращает ложный ответ в python 3

Иногда это относится к

$ sysctl vm.overcommit_memory
vm.overcommit_memory = 2

Если вы установите его на:

$ sysctl vm.overcommit_memory=0

Он должен работать.

1
задан Aran-Fey 13 July 2018 в 06:35
поделиться

2 ответа

Это обычная конструкция на большинстве объектно-ориентированных языков, поддерживающих наследование. Когда дочерний класс (в вашем случае int ) наследуется от родителя (в вашем случае object ), говорят, что он имеет «is-a», отношения. То есть, int является (или an) object.

Это отношение «is-a» является тем, что проверяет isinstance . Из документов:

Возвращает true, если аргумент object является экземпляром аргумента classinfo или (прямой, косвенный или виртуальный) подкласс.

Существует аналогичная функция issubclass для проверки того же отношения для класса вместо экземпляра этого класса. Фактически, в большинстве случаев isinstance(x, y) == issubclass(type(x), y).

type возвращает точный класс, из которого был создан объект. Это означает, что проверка type(3) == object в точности эквивалентна проверке int == object. Надеюсь, вы увидите, что это однозначно неверно.

В отношении связанного касания классы всегда должны быть одной и той же ссылкой в ​​заданном пробеге интерпретатора, поэтому вы можете использовать is вместо == для сравнения , Таким образом, type(3) is int будет правдой. Вот как == реализовано для всех типов, с которыми вы когда-либо столкнетесь.

2
ответ дан Mad Physicist 17 August 2018 в 13:32
поделиться
  • 1
    Отличный ответ, однако не против class и instance, потому что классы являются экземплярами типа – Florian 13 July 2018 в 07:17
  • 2
    @Florian. Я бы не сказал, что я выступаю против экземпляров и типов. Конечно, вы правы, что все классы являются экземпляром их метакласса (который не должен быть type или даже наследовать от него). Тем не менее, я чувствую, что это уровень педантичной детали, который OP не нужен и, возможно, не может справиться в данный момент. Также имейте в виду, что для функций, подобных issubclass и isinstance , требуется класс или набор классов для их второго аргумента. Поэтому классы, независимо от метакласса, имеют здесь особую цель. – Mad Physicist 13 July 2018 в 07:23
  • 3
    @Florian. То, что я действительно пытаюсь сказать, является «повышением, если вам нравится». :) – Mad Physicist 13 July 2018 в 07:27
  • 4
    Я отредактировал пару слов разъяснения – Mad Physicist 13 July 2018 в 07:28
  • 5
    Я уже поддерживал, и с редактированием это совершенно ясно и точно :) Я не был точен, классы - это экземпляр Type по умолчанию , но это не обязательно true . (например: в большинстве API с использованием метаклассов в качестве заводского шаблона) – Florian 13 July 2018 в 07:41

Все является объектом в Python, который включает в себя ints, строки, функции и классы. Поэтому isinstance(a, object) вернет вас True. Но 3 - это integer, который является sub_class созданным из object. Поэтому type(a) может быть только int.

Я могу привести пример.

Предположим, что у нас есть два класса: Sub - это sub_class of Base.

class Base:
    def __init__(self):
        self.kappa='kappa'
class Sub(Base):
    def __init__(self):
        super().__init__()

obj=Base()
int_rino=Sub()


print(isinstance(obj,Base))
print(isinstance(obj,Sub))
print(isinstance(int_rino,Base))
print(isinstance(int_rino,Sub))


print(type(int_rino)==Base)

Результат будет:

True
False
True
True
False
2
ответ дан Marcus.Aurelianus 17 August 2018 в 13:32
поделиться
  • 1
    основанный на вашей терминологии, я предполагаю, что вы вводите в заблуждение базовый класс и метакласс – Mad Physicist 13 July 2018 в 06:45
  • 2
    @ Mad Physicis, это сейчас? сэр. – Marcus.Aurelianus 13 July 2018 в 06:49
  • 3
    Намного лучше. Я чувствую, что я написал эту точную строку «все является объектом в python». ранее сегодня с таким же акцентом. Я бы рекомендовал удалить лишнюю запятую. – Mad Physicist 13 July 2018 в 07:02
  • 4
    @ Безумный физик, ладно, сэр. – Marcus.Aurelianus 13 July 2018 в 07:03
  • 5
    Виноват. Моя фраза была слегка другая: stackoverflow.com/a/51317646/2988730 :) – Mad Physicist 13 July 2018 в 07:08
Другие вопросы по тегам:

Похожие вопросы: