- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想测试一个对象是否是一个类的实例,并且只有这个类(没有子类)。我可以这样做:
obj.__class__ == Foo
obj.__class__ is Foo
type(obj) == Foo
type(obj) is Foo
有理由选择一个而不是另一个吗? (性能差异、陷阱等)
换句话说:a) 使用 __class__
和 type(x)
之间有什么实际区别吗? b) 使用 is
比较类对象总是安全的吗?
更新:感谢大家的反馈。我仍然对类对象是否是单例感到困惑,我的常识说它们是,但是很难得到确认(尝试谷歌搜索“python”,“class”和“unique”或“singleton”) .
我还想澄清一下,对于我的特殊需求,“更便宜”的解决方案是最好的,因为我正在尝试优化几个专业类(class)中的大部分(几乎达到目的明智的做法是放弃 Python 并在 C 中开发该特定模块)。但问题背后的原因是为了更好地理解语言,因为它的一些功能有点太模糊了,我无法轻易找到这些信息。这就是为什么我让讨论扩展一点而不是满足于 __class__ is
,所以我可以听到更有经验的人的意见。到目前为止,它非常富有成效!
我运行了一个小测试来对 4 个备选方案的性能进行基准测试。探查器结果是:
Python PyPy (4x)
type() is 2.138 2.594
__class__ is 2.185 2.437
type() == 2.213 2.625
__class__ == 2.271 2.453
不出所料,在所有情况下,is
的表现都优于 ==
。 type()
在 Python 中表现更好(快 2%),__class__
在 PyPy 中表现更好(快 6%)。有趣的是,__class__ ==
在 PyPy 中的表现优于 type() is
。
更新 2: 很多人似乎不明白我所说的“类是单例”是什么意思,所以我将举例说明:
>>> class Foo(object): pass
...
>>> X = Foo
>>> class Foo(object): pass
...
>>> X == Foo
False
>>> isinstance(X(), Foo)
False
>>> isinstance(Foo(), X)
False
>>> x = type('Foo', (object,), dict())
>>> y = type('Foo', (object,), dict())
>>> x == y
False
>>> isinstance(x(), y)
False
>>> y = copy.copy(x)
>>> x == y
True
>>> x is y
True
>>> isinstance(x(), y)
True
>>> y = copy.deepcopy(x)
>>> x == y
True
>>> x is y
True
>>> isinstance(x(), y)
True
如果有N个type
类型的对象并不重要,给定一个对象,只有一个是它的类,因此在这种情况下进行比较以供引用是安全的。而且由于引用比较总是比值(value)比较便宜,我想知道我上面的断言是否成立。我得出的结论是确实如此,除非有人提出相反的证据。
最佳答案
对于老式类,有区别:
>>> class X: pass
...
>>> type(X)
<type 'classobj'>
>>> X.__class__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: class X has no attribute '__class__'
>>> x = X()
>>> x.__class__
<class __main__.X at 0x171b5d50>
>>> type(x)
<type 'instance'>
新型类的重点是统一类和类型。从技术上讲,__class__
是唯一适用于新式和旧式类实例的解决方案,但它也会对旧式类对象本身抛出异常。您可以在任何对象上调用 type()
,但并非每个对象都有 __class__
。此外,你可以用 __class__
用一种你不能用 type()
捣乱的方式来捣乱。
>>> class Z(object):
... def __getattribute__(self, name):
... return "ham"
...
>>> z = Z()
>>> z.__class__
'ham'
>>> type(z)
<class '__main__.Z'>
就我个人而言,我通常有一个只包含新样式类的环境,并且就样式而言,我更喜欢使用 type()
,因为我通常更喜欢存在内置函数而不是使用魔法属性。例如,我也更喜欢 bool(x)
而不是 x.__nonzero__()
。
关于Python type() or __class__, == or is,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9610993/
假设a是张量,那么有什么区别: 类型(a) a.类型 a.type() 我找不到区分这些的文档。 最佳答案 type 是 python 内置方法。 它将返回对象的类型。喜欢 torch.Tensor.
什么是 Type 1 的居民的例子?两者都不是 Type也不是Type的居民?在 Idris REPL 中进行探索时,我无法想出任何东西。 更准确地说,我正在寻找一些 x除了 Type产生以下结果:
我找到了一些资源,但我不确定我是否理解。 我找到的一些资源是: http://help.sap.com/saphelp_nw70/helpdata/en/fc/eb2ff3358411d1829f00
这两个函数原型(prototype)有什么区别? void apply1(double(f)(double)); void apply2(double(*f)(double)); 如果目标是将提供的函
http://play.golang.org/p/icQO_bAZNE 我正在练习使用堆进行排序,但是 prog.go:85: type bucket is not an expression
假设有一个泛型定义的方法信息对象,即一个方法信息对象,这样的方法Info.IsGenericMethodDefinition==TRUE:。也可以说它们也有一个泛型参数列表:。我可以使用以下命令获取该
在具有依赖类型的语言中,您可以使用 Type-in-Type 来简化语言并赋予它很多功能。这使得语言在逻辑上不一致,但如果您只对编程感兴趣而不对定理证明感兴趣,这可能不是问题。 在 Cayenne
根据 Nim 手册,变量类型是“静态类型”,而变量在内存中指向的实际值是“动态类型”。 它们怎么可能是不同的类型?我认为将错误的类型分配给变量将是一个错误。 最佳答案 import typetrait
假设您有以下结构和协议(protocol): struct Ticket { var items: [TicketItem] = [] } struct TicketItem { } prot
我正在处理一个 EF 问题,我发现它很难调试...以前,在我的系统中有一个表类型继承设置管理不同的用户类型 - 所有用户共有的一种根类型,以及大致基于使用该帐户的人员类型的几种不同的子类型。现在,我遇
这是我的 DBManager.swift import RealmSwift class DBManager { class func getAllDogs() -> [Dog] {
我正在尝试使用傅里叶校正图像中的曝光。这是我面临的错误 5 padded = np.log(padded + 1) #so we never have log of 0 6 g
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
请考虑以下设置: protocol MyProcotol { } class MyModel: MyProcotol { } enum Result { case success(value:
好吧,我将我的 python 项目编译成一个可执行文件,它在我的电脑上运行,但我将它发送给几个 friend 进行测试,他们都遇到了这个错误。我以前从未见过这样的错误。我使用 Nuitka 来编译代码
当我尝试训练我的模型时"ValueError: Type must be a sub-type of ndarray type"出现在 line x_norm=(np.power(x,2)).sum(
我尝试在另一个类中打断、计数然后加入对象。所以我构建协议(protocol): typealias DataBreaker = () -> [Double] typealias DataJoiner
我正在使用 VS 2015 更新 3、Angular 2.1.2、Typescript 2.0.6 有人可以澄清什么是 typings 与 npm @types 以及本月很难找到的任何其他文档吗? 或
我正在考虑从 VS2010 更改为 Mono,因此我通过 MoMA 运行我的程序集,看看我在转换过程中可能遇到多少困难。在生成的报告中,我发现我不断收到此错误: bool Type.op_Equali
主要问题 不太确定这是否可能,但由于我讨厌 Typescript 并且它使我的编码变得困难,我想我会问只是为了确定。 interface ISomeInterface { handler: ()
我是一名优秀的程序员,十分优秀!