【发布时间】:2010-10-26 01:16:28
【问题描述】:
我想知道是否有可能创建一个在作为类方法调用时与作为实例方法调用时行为不同的方法。
例如,作为一个技能改进项目,我正在编写一个Matrix 类(是的,我知道已经有非常好的矩阵类)。我为它创建了一个名为identity 的类方法,它返回一个指定大小的单位矩阵。
现在,当在Matrix 的实例 上调用时,不需要指定大小似乎是合乎逻辑的;它应该返回一个与调用它的Matrix 大小相同的单位矩阵。
换句话说,我想定义一个方法,它可以确定它是否是通过实例调用的,如果是,则访问该实例的属性。不幸的是,即使在浏览了文档和一些谷歌搜索之后,我也没有发现任何表明这是可能的。有人知道不同吗?
编辑:
哇!显然,我还不太习惯一流的功能。这就是我最终得到的结果——感谢 Unknown 提供了密钥!
class Foo(object):
def __init__(self, bar):
self.baz = bar
self.bar = MethodType(lambda self: self.__class__.bar(self.baz), self, self.__class__)
@classmethod
def bar(cls, baz):
return 5 * baz
Foo.bar(3) # returns 15
foo = Foo(7)
foo.bar() # returns 35
编辑 2:
简单说明一下 - 这种技术(以及下面介绍的大多数技术)不适用于定义 __slots__ 的类,因为您无法重新分配该方法。
【问题讨论】:
-
该问题要求提供一个可以检测其调用方式的可调用对象。 (这应该可以使用检查模块来获取调用框架。)提出的“解决方案”是创建第二个可调用对象,一个绑定方法,该方法绑定到与第一个可调用对象同名的每个实例。这可以解决如何让类和“实例方法”同名的问题。但这与拥有一个可以充当两者之一的单个可调用对象不同。
-
@TerryJanReedy 是否可以在运行时检查调用帧?
-
是的,这就是我所说的“使用检查模块获取调用帧”的意思。为此有一个或多个函数。