当前位置: 首页 > 面试题库 >

从类的一个方法继承的两个方法在实例上是不同的,不是吗?

宗苗宣
2023-03-14
问题内容

有人可以解释为什么吗?

class Foo:
    def bar(self):
        pass

a = Foo()
b = Foo()

a.bar == b.bar # False
a.bar is b.bar # False

我认为他们都继承了class方法,这是一种方法。


问题答案:

通过类上定义的实例访问函数时,每次都会创建一个 绑定方法
对象。从文档:

调用方法时到底发生了什么?您可能已经注意到x.f()上面调用了不带参数的方法,即使f()指定了参数的函数定义也是如此。争论发生了什么?当没有任何参数调用需要参数的函数时,Python当然会引发异常-
即使该参数并未实际使用。

实际上,您可能已经猜到了答案:方法的特殊之处在于,实例对象作为函数的第一个参数传递。在我们的示例中,该调用x.f()与完全等效
MyClass.f(x)。通常,调用带有n个参数列表的方法等效于调用带有参数列表的函数,该参数列表是通过在第一个参数之前插入方法的实例对象而创建的。

如果您仍然不了解方法的工作方式,那么看一下实现也许可以澄清问题。 当引用的实例属性不是数据属性时,将搜索其类。
如果名称表示作为函数对象的有效类属性,则通过将实例对象和刚在抽象对象中一起找到的函数对象打包(指向)来创建方法对象:这是方法对象。

请注意, 每次您访问方法都会 发生这种情况:

>>> class Foo:
...    def bar(self): pass
...
>>> f = Foo()
>>> f.bar is f.bar
False

这是如何运作的?好吧,实际上,函数
是描述符对象 ,请注意a的存在__get__

>>> def func(): pass
...
>>> func.__get__
<method-wrapper '__get__' of function html" target="_blank">object at 0x101e38ae8>

换句话说,您可以认为Python函数是这样实现的:

class Function(object):
    . . .
    def __get__(self, obj, objtype=None):
        "Simulate func_descr_get() in Objects/funcobject.c"
        if obj is None:
            return self
        return types.MethodType(self, obj)

当然,它们不是在Python中实现的(至少在CPython中!)。

还要注意,直接在类上访问函数当然不会这样做(至少在Python 3上,您已在问题上对其进行了标记):

>>> Foo.bar is Foo.bar
True


 类似资料:
  • 我有一个带有注释方法的接口。注释用标记,所以我希望实现者继承它。然而事实并非如此: 所以问题是,为什么没有,尽管它实现了一个标记为的方法,即?

  • 我在阅读java 8默认方法时遇到了以下段落: 如果层次结构中的任何类具有具有相同签名的方法,则默认方法变得无关紧要。默认方法不能重写java.lang.Object的方法。原因很简单,因为Object是所有java类的基类。因此,即使我们将对象类方法定义为接口中的默认方法,它也是无用的,因为对象类方法将始终被使用。这就是为什么为了避免混淆,我们不能让默认方法重写对象类方法。 我很快尝试按照代码来

  • 假设我们有两个类A、B和各自类的同步方法methodA、methodB。如果我们从synchronizedmethodA调用synchronized methodB,那么当methodB仍在执行时,线程是否仍对ObjectA保持锁定?

  • 我正在编写一个带有对象的游戏,我想根据它的类使用不同的命令。我有一个超级类“项目”,一个子类“工具扩展项目”和“锤子扩展工具”。在项目超类(抽象)中,我有一个抽象方法“doCommand”,我在工具中覆盖了它。这很好用,我现在在工具中有一个有效的“doCommand”。但是当我想在 Hammer 中覆盖这个“doCommand”时,它只是使用工具的“doCommand”。 这来自调用方法的类的一部

  • 问题内容: 我面临有关Java方法同步的问题。希望我能简要解释一下: 我在两个不同的类中,在两个不同的包中有两个不同的方法。就像是: 好的,所以现在我需要同步这两个 不是thread的方法 。到目前为止,我有两种不同的方法: 共享信号量 。 在和外部创建一个共享的静态信号量,例如: 无论如何,我真的不知道JVM是否会将其视为共享信号量。 已同步(SharedClass.class) 。 使用共享类

  • 我有一个服务类叫“主机服务” 现在我想使用Mockito编写一个单元测试用例'HostServiceTest'。我将创建一个主机服务和模拟平台服务的实例,并监视这个主机服务实例来模拟isReachable方法。 在测试用例中,它不是调用isReachable的模拟方法,而是进入实际的方法。 我看到了这个问题:试图窥探方法是调用原始方法,我确实遵循了他们建议的方法,但它调用的是实际的方法。o 这可能