Python 使用来自其他模块的方法自动扩展类
我已经定义了几个作用于一个对象的方法,并且我有两个或多个不同的类不能从同一个父对象继承,并且具有该对象的实例。我想自动将所有方法添加到两个类中,删除第一个参数(对象),并将其替换为该类拥有的实例 有办法吗 我确信我的问题不清楚,所以我尝试给出一个超级简化的设置。为了保持简单,对象只是一个列表。我希望通过这个例子,我的目标是明确的!提前感谢您抽出时间Python 使用来自其他模块的方法自动扩展类,python,decorator,Python,Decorator,我已经定义了几个作用于一个对象的方法,并且我有两个或多个不同的类不能从同一个父对象继承,并且具有该对象的实例。我想自动将所有方法添加到两个类中,删除第一个参数(对象),并将其替换为该类拥有的实例 有办法吗 我确信我的问题不清楚,所以我尝试给出一个超级简化的设置。为了保持简单,对象只是一个列表。我希望通过这个例子,我的目标是明确的!提前感谢您抽出时间 #我定义了一些作用于对象的方法(在本例中,只有两个作用于列表的无用方法) def get_平均值(输入_列表): 返回和(输入列表)/len(输入列
#我定义了一些作用于对象的方法(在本例中,只有两个作用于列表的无用方法)
def get_平均值(输入_列表):
返回和(输入列表)/len(输入列表)
def乘法元素(输入元素列表,系数):
返回[i*输入列表中i的系数]
然后我们有两个不同的类,都有一个对象的实例(列表)
A类:
苹果列表=[]
def获取苹果列表(自我):
返回self.list\u苹果
B类:
“”“与(pples)完全不同的类,还包含一个列表”“”
熊的列表=[]
def获取熊的列表(自身):
返回self.list\u的\u熊
现在,要对a和B实例拥有的列表调用“list”方法,我需要执行以下操作:
b=b()
获取平均值(b.获取熊的列表()
相反,我的目标是自动定义一些包装器(如下所示),这将允许我直接从A和B的实例调用list方法。这里有一个B的示例:
B类:
“”“与(pples)完全不同的类,但包含列表”“”
熊的列表=[]
def获取熊的列表(自身):
返回self.list\u的\u熊
def get_平均值(自身):
return get_avg(self.list_熊)
def乘法_元素(自身、因子):
返回乘法\u元素(self.list\u的\u熊、因子)
使用扩展类,我可以简单地执行以下操作:
b=b()
b、 获取平均值()
b、 乘以元素(系数=10)
我想自动扩展A和B。我不知道为什么您的类不能从一个共同的祖先继承,但我能想到的一个解决方案是动态地使祖先:
def make_ancestor():
class Temp:
def get_avg(self):
input_list = getattr(self, self.list_name)
return sum(input_list) / len(input_list)
def multiply_elements(self, factor):
input_list = getattr(self, self.list_name)
return [i * factor for i in input_list]
return Temp
class A(make_ancestor()):
list_of_apples = []
list_name = 'list_of_apples'
def get_list_of_apples(self):
return self.list_of_apples
class B(make_ancestor()):
list_of_bears = []
list_name = 'list_of_bears'
def get_list_of_bears(self):
return self.list_of_bears
现在,由于父类是动态生成的,所以子类不会从同一父类继承。作为测试:
print(make_ancestor() == make_ancestor()) # False
因为它们是语义不同的类,所以我不希望有一个共同的祖先,但它们都包含一个复杂的对象,我在一个单独的模块中为其实现了逻辑。我认为在课堂上使用装饰器是可能的,但你的解决方案似乎也很有趣