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

标签 python class methods

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

例如,作为一个技能改进项目,我正在编写一个 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/

相关文章:

python - Matplotlib 中的单个点大小?

python - 排序函数中的 Lambda 函数

python - 使用 Python 映射 Windows 驱动器的最佳方法是什么?

class - 从另一个 *.ts 文件创建 typescript 的对象

swift - 无法从子类 Swift 中转换值

Python 不允许我在类定义尚未完成时使用类内部的方法

Java : Instantiating method variables

ios - 使方法在对象上工作

python - 快速检查大型数据库的编辑距离相似性

java - Java 8 中是否可以使用方法引用来定义/实现方法?