Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么类型(classInstance)返回';实例';?_Python_Class_Types_Instance - Fatal编程技术网

Python 为什么类型(classInstance)返回';实例';?

Python 为什么类型(classInstance)返回';实例';?,python,class,types,instance,Python,Class,Types,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

我有一个方法,它接受一个可以有几种类型的参数,并且必须根据类型做一件或另一件事,但是如果我检查所述参数的类型,我不会得到“真实”类型,我总是得到
,这会打乱我的比较

我有点像:

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(Class1())
也是
时,结果表明,即使参数是Class2的实例,它也将进入第一次比较

顺便说一下,
str(parameter.\uuuuuu class\uuuuu)
正确地显示了
classes.Class1
。我想我可以一直用这个,但我想知道发生了什么。。。我已经做了十分之一的这样的比较,所有的比较都很有效


谢谢!!:)

老式的课程就是这样做的。从定义中的对象派生类。

您应该真正使用isinstance:

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

In [27]: foo(x)
<type 'instance'>
True
[26]中的
:def foo(参数):
..:打印类型(参数)
..:打印isinstance(参数,类别1)
....:
In[27]:foo(x)
真的
类型对于内置类型更好。

事实上,
Type(x)
为遗留类的所有实例
x
返回相同的类型对象,也就是旧式类,这是这些类的许多令人恼火的缺陷之一——不幸的是,它们必须保留(并且是没有基的类的默认值)由于向后兼容的原因,在Python
2.*

然而,不要使用旧式类,除非您被迫维护一堆旧的遗留代码(没有一个好的测试套件来让您有信心尝试切换o类)。当一个类没有“自然”基时,从
object
对其进行子类化,而不是从无到有。或者,顶部的模块可以设置

__metaclass__ = type

这将默认值从简陋的旧样式类更改为闪亮的新样式类——虽然通常首选显式继承自
对象(“显式优于隐式”),但
\uuuuuuuuu元类
的模块全局设置可能感觉“入侵性较小”到现有的旧模块,您将从旧类切换到新类,因此这是一种可能性。

Woo!谢谢你的快速回答。。。我考虑过,但后来我读到了:我害怕了…:尽管我必须说,另一方面,“isinstance”应该适合我的需要……
isinstance
通常比直接的
type()
检查更可取,而且您在每次检查中实际实例化
Class1()
时使用的类型检查形式肯定是不可取的。然而,这篇文章所说的是,在许多情况下,检查类型(无论使用哪种方法)都是糟糕的编码实践的标志。在我看来,这篇文章毫无宗教意义,而且对类型检查仍然有有效的用途,但是,如果您正在对自己定义的类型进行“数十次”检查,这听起来确实像是一种潜在的“不够面向对象”的代码味道。您可以在Ops代码中清楚地看到为什么进行类型检查意味着您没有进行OOP:如果isinstace(obj,Cls)
之后出现的任何代码都应该是Cls方法。这听起来可能有点宗教色彩,但如果你想使用OOP(并不是你必须这么做),那么你必须至少做到这一点。。。我写的是一个简单的例子,让它尽可能清楚,但问题是我实际上可以接收(作为参数)Class1的对象,或Class1的对象列表(然后遍历列表并递归调用该方法,这样它的行为就好像接收到一个对象)或不是Class1的对象,但是它的值允许我初始化一个Class1对象,并使用该Class1实例再次调用该方法,等等。这就是为什么我需要检查type@BorrajaX这并不是更好,相反,这个方法和所有类似的方法应该总是获取并返回Class1的列表。有时列表只有一个元素,所以它们看起来可能毫无意义,但接口保持不变,这就是OOP.Wooo的要点。。。行得通!:)现在我要试着找出“为什么”…:DIt与新样式的类有更多的元数据有关,包括
type()
涉及的内容。Thx再次,我在读这篇文章:我有点(有点)觉得这样的东西应该是合理的谢谢!回答得也很好!我已经用了伊格纳西奥提议的那个。但是。。。最后,如果我的理解是正确的,它们是非常相似的,对吗?@Borrajax,显式继承自
对象
与不继承并拥有一个模块全局
\uuuuuuu元类=类型
的最终结果是完全相同的-非常不同的样式,无法区分的结果。