微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用来自另一个模块的方法自动扩展类

如何解决使用来自另一个模块的方法自动扩展类

想象一下,我已经定义了几个作用于一个对象的方法,并且我有两个或更多不同的类,它们不能从同一个父级继承,有一个实例目的。我想自动将所有方法添加到两个类删除一个参数(对象)并将其替换为类拥有的实例。

有办法吗?

我确定我的问题不清楚,所以我尝试给出一个超级简化的设置。为简单起见,对象只是一个列表。我希望在这个例子之后我的目标是明确的!提前感谢您抽出宝贵时间。

# I define some methods acting on an object (just 2 useless methods acting on a list in this example)
def get_avg(input_list):
    return sum(input_list) / len(input_list)


def multiply_elements(input_list,factor):
    return [i * factor for i in input_list]

然后我们有 2 个不同的类,它们都有一个我们对象的实例(列表)

class A:
    list_of_apples = []

    def get_list_of_apples(self):
        return self.list_of_apples


class B:
    """Totally different class from A(pples),also containing a list"""
    list_of_bears = []

    def get_list_of_bears(self):
        return self.list_of_bears

现在,要在 A 和 B 实例拥有的列表上调用“列表”方法,我需要执行以下操作:

b = B()
get_avg(b.get_list_of_bears())

相反,我的目标是自动定义一些包装器(如下所示),这将允许我直接从 A 和 B 的实例调用列表方法。这里有一个 B 的示例:

class B:
    """Totally different class from A(pples),but containing a list"""
    list_of_bears = []

    def get_list_of_bears(self):
        return self.list_of_bears

    def get_avg(self):
        return get_avg(self.list_of_bears)

    def multiply_elements(self,factor):
        return multiply_elements(self.list_of_bears,factor)

使用扩展类,我可以简单地做:

b = B()
b.get_avg()
b.multiply_elements(factor=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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。