gpt4 book ai didi

python - 作为实例方法调用时行为不同的类方法?

转载 作者:IT老高 更新时间:2023-10-28 22:17:14 28 4
gpt4 key购买 nike

我想知道是否有可能创建一个在作为类方法调用时与作为实例方法调用时行为不同的方法。

例如,作为一个技能改进项目,我正在编写一个 Matrix 类(是的,我知道已经有非常好的矩阵类)。我为它创建了一个名为 identity 的类方法,它返回一个指定大小的单位矩阵。

现在,当在 Matrixinstance 上调用时,不需要指定大小似乎是合乎逻辑的;它应该返回一个与它所调用的 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com