资讯专栏INFORMATION COLUMN

Python动态特性应对动态情况

Vicky / 2485人阅读

摘要:有一些定制类的特殊方法,如,其中一些具有动态特性的方法可以用来很方便地处理某些动态状况。动态化属性和方法的调用,当调用不存在的属性时,如果存在方法,就会调用方法来尝试获得属性。这种完全动态的调用可以应对一些动态情况,例如实现。

Python有一些定制类的特殊方法,如__str__()__iter__()__getitem__(),其中一些具有动态特性的方法可以用来很方便地处理某些动态状况。

Duck-typing

When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.

duck-typing是一种编程风格,它的含义是:一个对象的语义,不是由于它继承自特定的类或者实现某个接口,而是由它的属性和方法的集合所决定。也就是说,我们在使用一个对象的时候,不在乎它是什么类型、是否实现了特定的接口,而是在意它有没有我们需要的属性和方法。
其实这就是在没有语言约束的情况下来实现多态,不像C++使用继承和虚函数在语言上设置约束来实现多态,所以就需要程序员来进行约束,好的文档、代码、测试都是很需要的。
在用该风格编码时不要使用像type()isintance()这样的方法去测试函数中参数的类型,而是直接使用参数来表述行为,如果该参数没有应有的属性或方法,就会报错。
使用__getitem__()来使自己的类表现得和Python内建的listtupledict一样时,就依靠了这种风格,下面给出Wiki上关于duck-typing的Python示例代码:

class Duck:
    def quack(self):
        print("Quaaaaaack!")
    def feathers(self):
        print("The duck has white and gray feathers.")

class Person:
    def quack(self):
        print("The person imitates a duck.")
    def feathers(self):
        print("The person takes a feather from the ground and shows it.")
    def name(self):
        print("John Smith")

def in_the_forest(duck):
    duck.quack()
    duck.feathers()

def game():
    donald = Duck()
    john = Person()
    in_the_forest(donald)
    in_the_forest(john)

game()

in_the_forest(duck)方法不管duck参数是Duck类型还是Person类型,只要该类型的实例由quack和feathers方法就可以。

动态化属性和方法的调用

__getattr__,当调用不存在的属性时,如果存在__getattr__方法,就会调用__getattr方法来尝试获得属性。

__call__,使实例本身变成可调用的。
这种完全动态的调用可以应对一些动态情况,例如实现REST API。

class Chain(object):

    def __init__(self, path=""):
        self._path = path

    def __getattr__(self, path):
        return Chain("%s/%s" % (self._path, path))

    def __str__(self):
        return self._path

    def __call__(self, attr):
        return Chain("%s/%s" % (self._path, attr))

这样我们就不用给每个URL对应的API写方法了,采用链式的调用就可以,如schools/status/users,就可以用Chain().schools.status.users。某些REST API会在URL中添加参数,如/schools/users/ID/report,其中ID就是一个参数,是某个学生实际的学号,这时就可以利用__call__将对象变成可调用的,便可完成此功能,调用方式就是Chain().schools.users(ID).report

参考资料

廖雪峰的Blog

Python官方文档

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45392.html

相关文章

  • 测试管理之项目软件测试风险管理实践

    摘要:在软件测试活动中,作为一名测试人员有没有遇到过这样的场景,在测试一个特性或者制定一份测试方案时,往往会想着进行简单测试做简单设计,认为这个场景出现的概率太低,几乎不可能会存在,不测了实际应用时不可能会有这么大的用户量, ...

    用户84 评论0 收藏0
  • container-as-a-service-0x01 -- 基于Docker的私有云&混合

    摘要:基于的私有云混合云构建方案苏依蜀黍是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的可移植的自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括虚拟机集群和其他的基础应用平台。 container-as-a-service-0x01 -- 基于Docker的私有云&混合云构建方案 By 苏依蜀黍 . 2016.06.07 what Docker是一...

    import. 评论0 收藏0
  • 以静制动的TensorFlow Fold动态计算图介绍

    摘要:近日它们交锋的战场就是动态计算图,谁能在这场战争中取得优势,谁就把握住了未来用户的流向。所以动态框架对虚拟计算图的构建速度有较高的要求。动态计算图问题之一的多结构输入问题的高效计 随着深度学习的发展,深度学习框架之间竞争也日益激烈,新老框架纷纷各显神通,想要在广大DeepLearner的服务器上占据一席之地。近日它们交锋的战场就是动态计算图,谁能在这场战争中取得优势,谁就把握住了未来用户的流...

    waltr 评论0 收藏0
  • 浅谈对CSRF的认识,以及一些应对措施

    摘要:了解了攻击者利用的一些原理,就对应的可以找到一些对应措施在服务端验证的字段。因此,从某些方面来说,是相对安全的。个人觉得相对安全的做法就是既验证,同时也校验。整个过程虽然比较难,但这让自己对于有了更深刻的认识。 CSRF CSRF(Cross Site Request Forgery, 跨站域请求伪造)的定义,相信大家都不陌生。它是指攻击者通过诱导用户,打开已精心设计好的页面后,发送请...

    isaced 评论0 收藏0
  • 基于阿里云Serverless架构下函数计算的最新应用场景详解(一)

    摘要:如果使用阿里云函数计算,您将高峰期每小时的访问日志,或者低谷期每小时的访问日志交给一个计算函数处理,并将处理结果存到中。下面结合阿里云的函数计算产品来讲解各个应用场景中架构以及如何解决的场景中的痛点。 摘要: Serverless概念是近年来特别火的一个技术概念,基于这种架构能构建出很多应用场景,适合各行各业,只要对轻计算、高弹性、无状态等场景有诉求的用户都可以通过本文来普及一些基础概...

    Eidesen 评论0 收藏0

发表评论

0条评论

Vicky

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<