Почему тип (classInstance) возвращает 'экземпляр'?

У меня есть метод, который принимает параметр, который может иметь несколько типов и должен сделать одну вещь или другой в зависимости от типа, но если я проверяю тип упомянутого параметра, я не получаю 'реальный' тип, я всегда добираюсь <type 'instance'>, и это портит с моими сравнениями.

У меня есть что-то как:

from classes import Class1
from classes import Class2
# Both classes are declared in the same file.
# I don't know if that can be a problem         #
# ... #
def foo(parameter)
    if (type(parameter) == type(Class1()):
    # ... #
    elif (type(parameter) == type(Class2()):
    # ... #

И как type(parameter) возвраты <type 'instance'> и type(Class1()) <type 'instance'> также, оказывается, что, даже если параметр является экземпляром Class2, он входит в первое сравнение...

Между прочим, str(parameter.__class__) правильно шоу classes.Class1 . Я предполагаю, что мог всегда использовать это, но я хотел бы понять то, что продолжается... Я сделал десятые части сравнений как это, и все их работали правильно...

Спасибо!! :)

11
задан BorrajaX 24 June 2010 в 14:08
поделиться

3 ответа

Классы старого стиля делают это. Выведите свои классы из объекта в их определениях.

16
ответ дан 3 December 2019 в 02:00
поделиться

вы действительно должны использовать isinstance:

In [26]: def foo(param):
   ....:     print type(param)
   ....:     print isinstance(param, Class1)
   ....:

In [27]: foo(x)
<type 'instance'>
True

Тип лучше для встроенных типов.

10
ответ дан 3 December 2019 в 02:00
поделиться

Тот факт, что type (x) возвращает объект одного и того же типа для всех экземпляров x унаследованных, то есть старых классов, является одним из многих раздражающих дефектов такого рода. классов - к сожалению, они должны остаться (и быть по умолчанию для класса без базы) в Python 2. * по причинам обратной совместимости.

Тем не менее, не используйте классы старого стиля , если вы не вынуждены поддерживать кучу старого, унаследованного кода (без хорошего набора тестов, чтобы дать вам уверенность в том, чтобы попытаться переключиться на другой тип кода). классы). Если у класса нет «естественных» оснований, создайте подкласс из объекта , а не из ничего. В качестве альтернативы, ваш модуль вверху может установить

__metaclass__ = type

, который изменяет значение по умолчанию с грубых устаревших классов старого стиля на блестящие яркие классы нового стиля - в то время как явное наследование от объекта является обычно предпочтительнее («явное лучше, чем неявное»), глобальная настройка модуля __ метакласс __ может казаться «менее агрессивной» для существующих старых модулей, когда вы переключаетесь со старых классов на новые, поэтому предлагается как Возможность.

9
ответ дан 3 December 2019 в 02:00
поделиться
Другие вопросы по тегам:

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