有人可以解释为什么吗?
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 这可能