源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

python中实现定制类的特殊方法总结

  • 时间:2020-06-01 02:34 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:python中实现定制类的特殊方法总结
看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()函数。 除此之外,Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类。 [b]__str__[/b] 我们先定义一个Student类,打印一个实例:
[url=http://api.server/user/friends]http://api.server/user/friends[/url] [url=http://api.server/user/timeline/list]http://api.server/user/timeline/list[/url] 如果要写SDK,给每个URL对应的API都写一个方法,那得累死,而且,API一旦改动,SDK也要改。 利用完全动态的__getattr__,我们可以写出一个链式调用:
[u]复制代码[/u] 代码如下:
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
试试:
[u]复制代码[/u] 代码如下:
>>> Chain().status.user.timeline.list '/status/user/timeline/list'
这样,无论API怎么变,SDK都可以根据URL实现完全动态的调用,而且,不随API的增加而改变! 还有些REST API会把参数放到URL中,比如GitHub的API:
[u]复制代码[/u] 代码如下:
GET /users/:user/repos
调用时,需要把:user替换为实际用户名。如果我们能写出这样的链式调用:
[u]复制代码[/u] 代码如下:
Chain().users('michael').repos
就可以非常方便地调用API了。有兴趣的童鞋可以试试写出来。 [b]__call__[/b] 一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能直接在实例本身上调用呢?类似instance()?在Python中,答案是肯定的。 任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用。请看示例:
[u]复制代码[/u] 代码如下:
class Student(object):     def __init__(self, name):         self.name = name     def __call__(self):         print('My name is %s.' % self.name)
调用方式如下:
[u]复制代码[/u] 代码如下:
>>> s = Student('Michael') >>> s() My name is Michael.
__call__()还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。 如果你把对象看成函数,那么函数本身其实也可以在运行期动态创建出来,因为类的实例都是运行期创建出来的,这么一来,我们就模糊了对象和函数的界限。 那么,怎么判断一个变量是对象还是函数呢?其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个Callable对象,比如函数和我们上面定义的带有__call()__的类实例:
[u]复制代码[/u] 代码如下:
>>> callable(Student()) True >>> callable(max) True >>> callable([1, 2, 3]) False >>> callable(None) False >>> callable('string') False
通过callable()函数,我们就可以判断一个对象是否是“可调用”对象。 [b]小结[/b] Python的class允许定义许多定制方法,可以让我们非常方便地生成特定的类。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部