Python 是有名的动态类型语言,本身不支持函数重载。
class Foo:
def add(self, a):
pass
def add(self, a, b):
# 会覆盖上面已经定义类函数
pass
然而使用元编程 (meta-programming) 和 python 3.5+ 的 type hints,可以实现类函数重载。
然后写了一个库:pover - Python OVERload
pip3 install pover
使用一个 metaclass OverloadMeta
实现类函数重载。
#!/usr/bin/env python3
import unittest
import pover
class Foo(metaclass=pover.OverloadMeta):
def add(self, a: int):
return a + 1
def add(self, a: list):
return a + [1]
def add(self, a: set):
a.add(1)
return a
def minus(self, a: int):
return a - 1
def minus(self, a: str):
return a[:-1]
class OverloadTest(unittest.TestCase):
def test_overload(self):
foo = Foo()
self.assertEqual(foo.add(1), 2)
self.assertEqual(foo.add([0]), [0, 1])
self.assertEqual(foo.add({0}), {0, 1})
self.assertEqual(foo.minus(1), 0)
self.assertEqual(foo.minus("hello"), "hell")
具体实现原理在: https://github.com/idf/pover/blob/master/pover/core.py
GitHub 地址,请多指教: https://github.com/idf/pover
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.