Python动态特性应对动态情况
admin
2023-07-31 01:52:55
0

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官方文档

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...