这篇文章主要介绍“Python类中怎么定义多个构造器方法重载与泛方法”,在日常操作中,相信很多人在Python类中怎么定义多个构造器方法重载与泛方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python类中怎么定义多个构造器方法重载与泛方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!由多个方法组成的方法,这些方法为不同的类型实现相同的操作。现在有个需求,需要你通过以下几种方式创建一个自定义的日期类(CustomDate
):时间戳年、月、日(包含三个整数的元组)ISO 格式的字符串Datetime
类注:这里暂不讨论传入的日期/时间戳合不合法,仅仅只对类型做大致判断。我们可以将不同的构建方式拆分为多个方法,并利用 functools
中的 singledispatchmethod
装饰器来根据传入的参数类型决定调用哪个方法。这样一来,我们便能将每种参数类型的初始化独立成一个个的方法了。在调用期间应该使用哪个方法实现由分派算法决定。如果该算法只基于单个参数的类型来决定使用哪个方法实现,则称其为单分派。singledispatchmethod
就是就是单分派的。也就是说,只有第一个参数会作为考量。这在实际业务中是远远不足的。然而,如上,对元组中元素类型判断还是需要我们用 if
/else
实现。也就是说,我们不能使用 typing.Tuple[int, int, int]
。作为一种折中的方案,或许我们可以定义一个 ThreeIntTuple
类来对其进行限定,将这些判断从 CustomDate
类中隔离开来。这里仅提供免费云主机域名一个思路让大家参考,我就不实现了(因为我们有更好的方式 xD)。这个库不是标准库之一,需要通过 pip 安装:multimethod
采用的是多分派算法,能更好地满足更复杂的场景。此外,该库对 typing
中的类型也有不错的支持。回到上面的问题,我们可以这么改进:使用 multimethod
方法来替代 singledispatchmethod
;使用 Tuple[int, int, int]
来替代 tuple
,不再需要手动校验元组的长度和元素类型了;在此之前,先问大家一个简单的问题(这跟我们之后的内容有很大的联系):以上这段代码会输出什么?还是会抛出错误?输出 2
。在 Python 中,如果定义了重名的方法,最后一个方法是会覆盖掉之前的方法的。但你或许不知,我们可以通过元类(metaclass)来改变这一行为:在第 7 和第 8 行,我们将重名的 a
方法改名为 b
,并在第 22 行成功地调用它了。multimethod
的维护者们很好地运用了这一点,对重名的方法进行了处理,以达到一种“特殊的效果”。回到正题,我们可以做出如下改进:将 multimethod.multidata
设置为 CustomDate
类的元类;将所有方法命名为 __init__
。从效果上来看,这完全和静态语言的方法重载一模一样!到此,关于“Python类中怎么定义多个构造器方法重载与泛方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!
本篇内容介绍了“微信小程序怎么解析网页内容”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!这里我们采用node-webshot模块,它对PhantomJS进行了轻…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。