- 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/
public class Foo : IFoo ... 和有什么区别 IFoo foo = new Foo(); 和 Foo foo = new Foo(); 最佳答案 区别仅在于变量的声明类型。每当
class Foo { public: explicit Foo() {} explicit Foo(Foo&) {} }; Foo d = Foo(); error: no matc
是 foo as? Foo完全等同于 foo as Foo? ? 如果是,那为什么两者都有? 如果不是,那么有什么区别? 最佳答案 as?是 safe cast operator . 通常,如果您尝试
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
这个问题在这里已经有了答案: Why is there an injected class name? (1 个回答) 关闭5年前。 一位同事不小心写了这样的代码: struct foo { fo
我遇到了这些关键字::foo、::foo、::bar/foo 和 :bar/foo 您能举例说明差异吗? 最佳答案 :foo 是一个非完全限定的关键字。它没有关联的命名空间。 (name :foo)
有人问我如何简化这个 lambda (Foo foo) -> foo.getName() 还有更好的写法吗? 最佳答案 Foo::getName。 假设getName是一个实例方法,其签名中的参数列表
编写此规则集的 CSS 组合器或简写是什么? foo bar, foo biz, foo gaz > boo, foo tar { ... } 我很确定我在 MDN 的某处读到过有一个。是不是: f
我有一个用这个字符串填充的输入文本 "foo foo"但插入后字符串看起来像这样 "foo foo" .我该如何解决?我想以第一种格式显示字符串! 最佳答案 你可能有这样的事情: " /> 更改 va
假设我有一个不可复制类Foo,它的构造函数之一恰好接收到对 Foo 的引用。 class Foo { public: Foo(Foo& parent) {...} private: v
class Artist @@song_count = [] attr_accessor :name, :songs def initialize(name) @name = name
请解释为什么这些 Perl 函数的调用方式在函数定义之上决定了它们是否运行。 print "Why does this bare call to foo not run?\n"; foo; print
文件名分为三种类型 首先( Root 于某种“当前工作目录”之下) ../foo ./foo bar/foo # really in this group? 和( Root 于绝对路径,独立于 CWD
我想自动连接 foo: @Autowired Foo foo 但我无法修改类 Foo 并将其标记为 @Component。 Autowiring foo 最干净的方法是什么? 顺便说一句,如果您需要使
我一直在使用 Python 的 ElementTree 创建 XML 文档,到目前为止一切顺利。然而我现在面临的问题是,由于项目要求,我需要生成一个 XML 文档,其中包含带有开始和结束标签的元素以及
class Foo { public: Foo(){} private: Foo(const Foo &); }; Foo f(); Foo f1 = Foo(); 我发现当我将 Fo
我有一个 jquery 对话框,上面有一个按钮(我的按钮,不是对话框按钮之一)。 设置对话框后,我有以下代码: $('#bar').click(foo('baz')); 当我加载页面并显示对话框时,f
我遇到了以下变量的情况: var foo: Foo | Foo | Foo; 动态生成(使用 keyof 和 stuff),这在代码的那个点是完全有意的。但是,我需要调用像这样定义的对象内部的方法:
clang 3.5.0 和 gcc 4.9.1 从代码生成的可执行文件 #include struct Foo { Foo() { std::cout << "Foo()" << std::e
对于声明为 Foo& foo = ...; 的 foo,lambdas 的按值捕获和按引用捕获语义之间有什么区别吗? 最佳答案 我认为你已经陷入了一个常见的误解......引用是对真实对象的别名。初始
我是一名优秀的程序员,十分优秀!