- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑类:
Foo(object):
def __init__(self):
pass
在 Python 2 上执行 type(Foo.__init__)
:
Python 2.7.5 (default, Mar 9 2014, 22:15:05)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo(object):
... def __init__(self):
... pass
...
>>> type(Foo.__init__)
<type 'instancemethod'>
在 Python 3 上执行 type(Foo.__init__)
:
Python 3.4.1 (default, May 19 2014, 13:10:29)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo(object):
... def __init__(self):
... pass
...
>>> type(Foo.__init__)
<class 'function'>
为什么 Python 2 和 3 上 type(Foo.__init__)
的返回结果不同?
最佳答案
如果您问更改了什么,简短版本位于 What's New in 3.0 :
The concept of “unbound methods” has been removed from the language. When referencing a method as a class attribute, you now get a plain function object.
更详细:
函数对象是 descriptor它的 __get__
返回一个方法。在 Python 2.x 中,它看起来像这样(纯 Python 伪代码,并稍作简化):
class FunctionType(object):
# other stuff
def __get__(self, instance, cls):
return MethodType(func=self, instance=instance, cls=cls)
class MethodType(object):
def __init__(self, func, instance, cls):
self.__func__, self.__instance__, self.__class__ = func, instance, cls
def __call__(self, *args, **kwargs):
if self.__self__ is not None:
return self.__func__(self.__self__, *args, **kwargs)
else:
return self.__func__(*args, **kwargs)
因此,当您编写 Foo.__init__
时,您将返回未绑定(bind)的方法 MethodType(__init__, None, Foo)
。
在 3.x 中,它看起来像这样:
class FunctionType(object):
# other stuff
def __get__(self, instance, cls):
if instance is not None:
return MethodType(func=self, instance=instance)
else:
return self
class MethodType(object):
def __init__(self, func, instance):
self.__func__, self.__instance__, self.__class__ = func, instance, type(instance)
def __call__(self, *args, **kwargs):
return self.__func__(self.__self__, *args, **kwargs)
有关完整详细信息,请参阅 3.x 的引用文档中的标准层次结构与 2.x ,在“可调用类型”下。
<小时/>如果你问为什么它被改变了......好吧,据我记得,对此没有太多讨论 - 没有 PEP,没有关于 python-dev 或 -ideas 的长讨论等等——文档中只给出了这一行。
但推理似乎很明显。未绑定(bind)的方法并不是特别有用;它们只是额外的脚手架,提供与它们所包装的函数完全相同的行为。*它们仅在 2.2-2.7 中出现,以便更好地模拟经典类的行为**和/或因为这种方式似乎更容易实现和/或因为在设计初期,不清楚是否可以在没有它的情况下实现像 @classmethod
这样的东西,当 Guido 足够深入地意识到那里没有问题时,它是更容易将设计保留为他最初编写的样子。
* 绑定(bind)方法的 CPython 实现添加了一个 isinstance
检查来验证第一个参数是否是 self.__class__
,但这没有明确记录,没有人编写依赖于它的代码,并且它对调试的帮助不如您所期望的那样。
** 如果你想知道为什么经典类会这样工作,你必须深入研究 Guido 的 Python History博客——如果您有时间,所有这些都值得一读。
关于Python 2/3 : Why is type(Foo. __init__) 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25228778/
假设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: ()
我是一名优秀的程序员,十分优秀!