- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以这段代码为例:
class SomeClass():
def a_method(self):
pass
print(SomeClass.a_method is SomeClass.a_method) # Example 1: False
print(SomeClass.a_method == SomeClass.a_method) # Example 2: True
print(SomeClass().a_method is SomeClass().a_method) # Example 3: False
print(SomeClass().a_method == SomeClass().a_method) # Example 4: False
最佳答案
Someclass.a_method
是一个未绑定(bind)方法。如今,这些甚至在 Python 中都不存在,因此请将其视为无用的历史课。
Does Python make a copy of the method each time it is referenced?
是的,或多或少。这是通过 descriptor protocol 完成的.
>>> SomeClass.a_method # unbound method via attribute access
<unbound method SomeClass.a_method>
>>> SomeClass.__dict__['a_method'] # just stored as a function in the class dict
<function __main__.a_method>
>>> SomeClass.__dict__['a_method'].__get__(None, SomeClass)
<unbound method SomeClass.a_method>
最后一行显示了描述符为类的属性访问而调用的“绑定(bind)”操作,但是是手动写出来的。在纯 Python 中,它是这样的
class Function(object):
def __get__(self, obj, objtype=None):
"Simulate func_descr_get() in Objects/funcobject.c"
return types.MethodType(self, obj, objtype):
您还可以通过这种方式创建绑定(bind)方法:
>>> some_instance = SomeClass()
>>> SomeClass.__dict__['a_method'].__get__(some_instance, SomeClass)
<bound method SomeClass.a_method of <__main__.SomeClass instance at 0xcafef00d>>
方法比较是通过方法的 __func__
和 __self__
属性完成的。在这种情况下,它们是相同的:__func__
是您可以从类 dict 中挖掘出的相同的普通旧函数,而 __self__
是 None
。因此,尽管这些方法是不同的对象,但它们比较起来是相等的。
正确。它们是不同的对象,因此并不相同。
如前所述,比较是使用 __func__
和 __self__
属性。结果与示例 2 不匹配,因为在这种情况下,__self__
属性引用不同的实例。那些不同的实例比较不相等,因为 SomeClass
实例按身份进行比较,因此这些方法也不相等。
除了示例 1 之外,上面提到的所有内容也适用于该语言的当前版本。在 Python 中,不再有未绑定(bind)方法这样的东西,对象模型中这种不必要的复杂化已被移除。
>>> SomeClass.a_method
<function __main__.SomeClass.a_method(self)>
>>> SomeClass.a_method is SomeClass.__dict__['a_method']
True
Python 2 中的“未绑定(bind)方法”现在只是一个普通的旧函数,通过属性访问检索的实例与类字典中的对象相同。在 Python 2 -> Python 3 升级中,示例 1 结果从 False
更改为 True
。
关于python - 为什么这是错误的? `SomeClass.method is SomeClass.method`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49765019/
我最近开始学习 Java,并且在使用泛型时遇到了问题。我使用参数和参数上限 NumberBox仅存储 Number 的类对象并进行比较。每当我尝试创建未知数列表 List>存储任何 NumberBox
我遇到了一个我以前从未见过的结构,想知道它的目的是什么: { SomeClass &a = *new SomeClass(...); a.someFunc(); } 如果我的理解是正确
我想打印我的类(class)的属性值。 fun print() { val cl = this::class cl.declaredMemberProperties.filter {i
在 Java 6 中类似于 MyClass和 MyClass被认为是相等的,但在 Java 7 中它们不是。 以 Java 7 为例,我偶然发现了 Hamcrest 匹配器的问题,这些匹配器被赋予了一
我已经实现了一个 ActionFilterAttribute,它将 SomeClass 映射到 SomeOtherClass。这是构造函数: public class MapToAttribute :
以这段代码为例: class SomeClass(): def a_method(self): pass print(SomeClass.a_method is SomeCla
应该 SomeClass* initialEl = new SomeClass[5];必须编译,假设 SomeClass 没有非公开声明的默认构造函数?考虑: /* * SomeClass.h *
抱歉,这看起来像是一个菜鸟问题,但对 Google 来说却是一个真正的痛苦。我正在使用 C++,虽然我可以通过指针和引用获得,但有时对我来说仍然很神秘。 我有一些代码,类似于 SomeClassNam
我刚刚将我的 Spring Boot 1.5.13 应用程序(使用 Lombok)升级到 Spring Boot 1.5.14,但它现在无法编译并出现以下类型的错误: constructor Some
我一直在制作一个加权的随机敌人生成系统,效果很好,只是改变了权重却没有。 我一直在尝试将一个 Class 转换为纯粹的 Enemy 类,这正是破坏系统的原因,或者至少 Eclipse IDE 是这么说
class SomeClass{ List list=new ArrayList();//getter and setters } 在上面的类中,我创建了相同类对象的列表对象。我想知道上面代码的影响
我有一个类对象列表的 JavaRDD。我想将它展平为类对象的 JaveRDD,这样JavaRDD 转到 JavaRDD 在这篇文章中 Convert RDD List to RDD of indivi
我在 XPages 应用程序中遇到偶尔的异常: java.lang.ClassCastException: someClass incompatible with someClass. 两个提到的类是
我正在调用一个soap Web 服务,该服务具有我们使用wsdl2java 从wsdl 生成的结构。包/类之一是 some.package.SomeClass。一旦我们在 some.package.S
我正在致力于外部化资源适配器 rars。 之前,rar 被打包在 war 的/lib 中,一切都运行良好。现在,为了使 war 变得轻松且通用,我想外部化资源适配器。 我已经做了什么 Removed
我试图了解这两种模拟构造之间的区别,以及何时适合使用它们。我在解释器中对其进行了测试,例如: >>> mm = mock.MagicMock(spec=list) >>> ca = mock.crea
我注意到 Collections.sort 的规范: public static void sort(List list, Comparator c) 为什么这里需要“? super”?如果Clas
有什么区别: SomeClass 和 SomeClass 最佳答案 Sun 说(来自 Using and Programming Generics in J2SE 5.0) There are thr
我脑抽筋了:我有一个 public interface SomeInterface和一个 static private class SomeClass并试图返回 List从我的一种方法,但我得到了错误
我在 CSS 方面经验不多,但最近我发现在类选择器前有空格和没有空格是有区别的。到目前为止,我只知道它们被解释为两种不同的东西......有 CSS 经验的人可以向我解释具体的区别是什么吗?这是否也适
我是一名优秀的程序员,十分优秀!