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
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]
解决方案
推荐阅读
- php - 将包含空格的字符串作为响应从 php 发送到 Android
- jquery - 在新选项卡中打开外部链接,但排除某些链接
- r - R mutate ifelse 用计算的函数值更新条件行
- python - 动态规划 - 洗车
- amazon-web-services - 使用 terraform 创建 ec2 实例时生成包含“IP 地址”的 user_data
- c++ - 一旦对象设置为null,用于声明对象堆大小的变量被设置为null?
- android - android apk jenkins 的存档工件
- python - Python:编写识别对象并对其进行计数的代码
- php - Unix 时间到第二天的时间戳
- android - 使用默认视频意图 ACTION_VIDEO_CAPTURE 录制不带声音的视频或在视频录制后删除声音,例如快速聊天