Python 一个函数作为类,也作为实例方法
这可能是所谓的XY问题,让我从我想要的开始: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
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)
。