我想知道是否有可能创建一个在作为类方法调用时与作为实例方法调用时行为不同的方法。
例如,作为一个技能改进项目,我正在编写一个 Matrix
类(是的,我知道已经有非常好的矩阵类)。我为它创建了一个名为 identity
的类方法,它返回一个指定大小的单位矩阵。
现在,当在 Matrix
的 instance 上调用时,不需要指定大小似乎是合乎逻辑的;它应该返回一个与它所调用的 Matrix
大小相同的单位矩阵。
换句话说,我想定义一个方法,它可以确定是否通过实例调用它,如果是,则访问该实例的属性。不幸的是,即使在浏览了文档和一些谷歌搜索之后,我也没有发现任何表明这是可能的。有人知道不同吗?
编辑:
哇!显然,我还不太习惯一流的功能。这就是我最终得到的结果——感谢 Unknown 提供了 key !
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__
的类,因为您无法重新分配该方法。
最佳答案
有用的 Python hack 是我的强项。
from types import *
class Foo(object):
def __init__(self):
self.bar = methodize(bar, self)
self.baz = 999
@classmethod
def bar(cls, baz):
return 2 * baz
def methodize(func, instance):
return MethodType(func, instance, instance.__class__)
def bar(self):
return 4*self.baz
>>> Foo.bar(5)
10
>>> a=Foo()
>>> a.bar()
3996
关于python - 作为实例方法调用时行为不同的类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/861055/