[英]Why type(classInstance) is returning 'instance'?
我有一个方法接受一个可以是几种类型的参数,并且必须根据类型做一件事或者其他事情,但如果我检查所述参数的类型,我不会得到'真实'类型,我总是得到<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'>
并且type(Class1())
也是<type 'instance'>
type(Class1())
<type 'instance'>
,事实证明即使参数是Class2的一个实例,它也会进入第一个比较...
顺便说一下, str(parameter.__class__)
正确地显示了classes.Class1
。 我想我总是可以使用它,但我想了解发生了什么...我已经做了十分之一的比较,所有这些都正常工作......
谢谢!! :)
旧式课程就是这么做的。 从定义中的object
派生类。
你应该真的使用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.*
一个没有基类的类2.*
出于向后兼容的原因。
不过, 不要使用旧式的类,除非你被迫维护一堆旧的遗留代码(没有一个好的测试套件让你有信心尝试切换类o)。 当一个类没有“自然”基础时,将它从object
继承而不是从无。 或者,您的模块位于顶部,可以设置
__metaclass__ = type
它将默认从古老的旧式类更改为闪亮的新式类 - 虽然显式继承自object
通常是首选(“显式优于隐式”), __metaclass__
的模块全局设置可能对现有的旧模块感觉“侵入性较小”,你可以从旧课程转换到新课程,因此可以提供。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.