Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一个函数作为类,也作为实例方法_Python - Fatal编程技术网

Python 一个函数作为类,也作为实例方法

Python 一个函数作为类,也作为实例方法,python,Python,这可能是所谓的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

这可能是所谓的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)
更新:

正如@lllrnr101在评论中指出的,我的问题的一部分已经在这里得到了回答:

我的问题是更广泛的,我认为它不必作为重复关闭

更新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]

你想将类方法转发到实例方法吗?使用描述符?为什么不编辑。get_object().add().add().add().add()?@tstanisl对不起,我不确定你的意思好的,所以我仍然有一个问题,为什么不直接编写
ed=Edit().add(1).mul(10)
。或者,如果您确实希望节省键入和/或使其看起来更聪明或更优雅,您可以为第一个操作创建顶级工厂函数:例如
def add(x):return Edit().add(x)