У меня есть метод, который принимает параметр, который может иметь несколько типов и должен сделать одну вещь или другой в зависимости от типа, но если я проверяю тип упомянутого параметра, я не получаю 'реальный' тип, я всегда добираюсь <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
. Я предполагаю, что мог всегда использовать это, но я хотел бы понять то, что продолжается... Я сделал десятые части сравнений как это, и все их работали правильно...
Спасибо!! :)
Классы старого стиля делают это. Выведите свои классы из объекта
в их определениях.
вы действительно должны использовать isinstance:
In [26]: def foo(param):
....: print type(param)
....: print isinstance(param, Class1)
....:
In [27]: foo(x)
<type 'instance'>
True
Тип лучше для встроенных типов.
Тот факт, что type (x)
возвращает объект одного и того же типа для всех экземпляров x
унаследованных, то есть старых классов, является одним из многих раздражающих дефектов такого рода. классов - к сожалению, они должны остаться (и быть по умолчанию для класса без базы) в Python 2. *
по причинам обратной совместимости.
Тем не менее, не используйте классы старого стиля , если вы не вынуждены поддерживать кучу старого, унаследованного кода (без хорошего набора тестов, чтобы дать вам уверенность в том, чтобы попытаться переключиться на другой тип кода). классы). Если у класса нет «естественных» оснований, создайте подкласс из объекта
, а не из ничего. В качестве альтернативы, ваш модуль вверху может установить
__metaclass__ = type
, который изменяет значение по умолчанию с грубых устаревших классов старого стиля на блестящие яркие классы нового стиля - в то время как явное наследование от объекта
является обычно предпочтительнее («явное лучше, чем неявное»), глобальная настройка модуля __ метакласс __
может казаться «менее агрессивной» для существующих старых модулей, когда вы переключаетесь со старых классов на новые, поэтому предлагается как Возможность.