- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定类(class):
class MyClass(object):
@classmethod
def my_class_method(cls):
return None
为什么
MyClass.my_class_method is MyClass.my_class_method
评估为False
,而此
id(MyClass.my_class_method) == id(MyClass.my_class_method)
是真
吗?
最佳答案
classmethod
装饰器将方法包装在描述符中。MyClass.my_class_method
与代码 MyClass.__dict__['my_class_method'].__get__(None, MyClass)
; 的作用相同。 __get__
为每次调用返回一个不同的绑定(bind)方法包装器,因此这两个是不同的对象,is
失败。
id
being the same is just a (common) coincidence ,因为CPython中的id
是根据对象所在的地址计算的;当计算出第一个绑定(bind)方法包装器的id
时,减少该包装器的引用计数并释放该包装器;碰巧第二个将被分配在完全相同的地址。 id(obj)
保证仅对于每个当前事件的对象是不同的。
在 Python 2 中,前者对于未绑定(bind)方法也适用:
>>> class MyClass():
... def x(self):
... pass
...
>>> MyClass.x
<unbound method MyClass.x>
>>> MyClass.x is MyClass.x
False
在 Python 3 中,未绑定(bind)方法语义已更改,现在
>>> class MyClass():
... def x(self):
... pass
...
>>> MyClass.x
<function __main__.x>
>>> MyClass.x is MyClass.x
True
未绑定(bind)的实例方法是 Python 3 中的裸函数,每次查找都会生成相同的对象。
关于python - 类方法的同一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28792202/
我有这个代码 update_questions: function() { alert("UPDATING!!"); }, poll: function() {
如果有一个工具可以自动美化我的 js 代码,那么我宁愿使用那个包。 我想扩展所有内容,例如这样的语句: var n=x+(y+(z/k))-123; 变成: var n = x + (y + (z /
我是一名优秀的程序员,十分优秀!