首页 > 解决方案 > 一个函数作为一个类,也是实例方法

问题描述

这可能是所谓的 XY 问题,所以让我从我想要的开始:

ed = Edit.add(1).add(2).add(3)
print(ed.op)    # [1,2,3]

以下是我尝试过的,基本上我得到了工作代码,但我不确定我是否做对了,或者是否有其他选择。

第一个add(1)是类方法调用,接下来add(2)add(3)实例方法调用。我从这里开始:

class Edit:
    def __init__(self):
        self.op = []

    @classmethod
    def add(cls, x): 
        self = cls()
        return self.add_im(x)

    def add_im(self, x): # im = instance method
        self.op.append(x)
        return self

ed = Edit.add(1).add_im(2).add_im(3)
print(ed.op)

但我想在任何地方都使用相同的名称,所以我添加了一些属性名称重写:

class Edit:
    def __init__(self):
        self.op = []

    def __getattribute__(self, name):
        if name == "add":
            name = "add_im"
        return super().__getattribute__(name)

    @classmethod
    def add(cls, x): 
        self = cls()
        return self.add(x)

    # im = instance method
    def add_im(self, x): 
        self.op.append(x)
        return self

ed = Edit.add(1).add(2).add(3)
print(ed.op)

更新:

正如@llllrnr101 在评论中指出的那样,我的问题的一部分已经在这里得到了回答:classmethod 和 instancemethod 的同名

我的问题更广泛,我认为它不必作为副本关闭。

更新2:

在研究了提到的线程后,我现在有了新版本,我很满意:

class dualmethod(classmethod):
    def __get__(self, instance, typ):
        if instance is None:
            instance = typ()  # create an instance "on the fly"
        return self.__func__.__get__(instance, typ)

class Edit:
    def __init__(self):
        self.op = []

    @dualmethod
    def add(self, x): 
        self.op.append(x)
        return self

ed = Edit.add(1).add(2).add(3)
print(ed.op)    # [1,2,3]

标签: python

解决方案


推荐阅读