python-自定义个add函数玩玩-多态

这篇博客介绍了如何使用Python实现多态,通过一个ADD类展示了如何处理数值、字符串、列表和字典的相加操作。代码首先演示了直接在类中实现的多态形式,然后重构为使用工厂类AddFactory来创建不同类型的子类(NumberAdd、StrAdd、ListAdd),以实现更清晰的代码结构。示例展示了这些子类如何处理不同类型的数据并返回相加结果。
摘要由CSDN通过智能技术生成

函数:add(a,b,*args)

功能:返回两个及以上的数值、字符串、列表、字典相加的结果

代码:

class ADD:
    'override "add"'

    def __init__(self):
        return

    @classmethod
    def add(cls, a, b, *args):
        # 数值
        if type(a) in (int, float) and type(b) in (int, float):
            s = a + b
            for i in args:
                assert type(i) in (int, float), 'error:code 1'
                s += i
            return s
        # 字符串
        elif type(a) == type(b) == str:
            la, lb = list(a), list(b)
            la.extend(lb)
            for i in args:
                assert type(i) == str, 'error:code 2'
                la.extend(list(i))
            return ''.join(la)
        # 列表
        elif type(a) == type(b) == list:
            a.extend(b)
            for i in args:
                assert type(i) == list, 'error:code 3'
                a.extend(i)
            return a
        # 字典
        elif type(a) == type(b) == dict:
            for k, v in b.items():
                if k not in a.keys():
                    a[k] = v
            for i in args:
                assert type(i) == dict, 'error:code 4'
                for k, v in i.items():
                    if k not in a.keys():
                        a[k] = v
            return a
        else:
            assert False, 'type error.'


print(ADD.__doc__)
print(ADD.add(1,2.5,8,))
print(ADD.add('hello',' ','world','!'))
print(ADD.add([1,2,3],[4,5,6],[7,8,9]))
print(ADD.add({'1': 'a'}, {'2': 'b', '1': 'c'}, {'3': 'd'}))

运行结果: 

说明:

字典相加为自定义,非正式

写成多态形式:

参考文章:面向对象之多态理解,多态的作用与好处 - NFC - 博客园 (cnblogs.com)

代码:

class ADD:
    def __init__(self, a, b, *args):
        self.a, self.b = a, b
        self.args = args

    def add(self): return


class AddFactory:
    def __init__(self, a, b, *args):
        self.a, self.b = a, b
        self.args = args

    def add(self):
        a, b, args = self.a, self.b, self.args
        if type(a) in (int, float) and type(b) in (int, float) and all([type(i) in (int, float) for i in args]):
            na = NumberAdd(a, b, *args)
            return na.add()
        elif all([type(i) == str for i in args] + [type(a) == str, type(b) == str]):
            sa = StrAdd(a, b, *args)
            return sa.add()
        elif all([type(i) == list for i in args] + [type(a) == type(b) == list]):
            la = ListAdd(a, b, *args)
            return la.add()
        else:
            assert False, 'type error.'


# 数值
class NumberAdd(ADD):
    def __init__(self, a, b, *args):
        super().__init__(a, b, *args)

    def add(self):
        s = self.a + self.b
        for i in self.args:
            s += i
        return s


# 字符串
class StrAdd(ADD):
    def __init__(self, a, b, *args):
        super().__init__(a, b, *args)

    def add(self):
        la, lb = list(self.a), list(self.b)
        la.extend(lb)
        for i in self.args:
            la.extend(list(i))
        return ''.join(la)


# 列表
class ListAdd(ADD):
    def __init__(self, a, b, *args):
        super().__init__(a, b, *args)

    def add(self):
        self.a.extend(self.b)
        for i in self.args:
            self.a.extend(i)
        return self.a


if __name__ == '__main__':
    numbers = AddFactory(4.5, 5.5, 2, )
    strs = AddFactory('hello', ' ', 'world', '!')
    lists = AddFactory([1, 2], [3, 4], [5])
    print(numbers.add())
    print(strs.add())
    print(lists.add())

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值