python3 定制类的学习记录(REST API, url)

a = ("123")
print(a)
  • 这段代码在pycharm中,利用debug模式发现a = '123', 说明()可以返回里面的结果。

class Chain(object):
    def __init__(self, path=''):
        self.path = path

    def __getattr__(self, item):
        return Chain('%s/%s' % (self.path, item))

    def __str__(self):
        return self.path
    __repr__ = __str__

    def __call__(self, path):
        return Chain('%s/%s' % (self.path, path))
    
print(Chain().python.learn.oop.username('ford'))

这是一个REST API的小例子,引用来自这里

结果 /python/learn/oop/username/ford

记录下此处的理解:
Chain()实例了一个Chain对象,
str重写了之后,可以直接打印对象,返回并输出self.path(默认空的路径),
此时Chain()调用完这个对象的self.path='',
然后 .python调用时没有python属性
进入getattr中返回/python
以此类推,再次调用Chain()并且改变self.path得值......../python/learn/oop,username('ford')此处可以拆分username也是一个属性和('ford')分开,会得到/python/learn/oop/username,返回一个Chain()对象 类(),
类调用和函数调用类似,实现call就可以 类() 了。

Chain().python.learn.oop.username返回了一个Chain()对象, 类中实现了call, 此时传入的参数ford对应的是def call(self, path):中的path
最后返回的一个总路径就是 /python/learn/oop/username/ford

  • 一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法call()

  • getattr函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过dict)失败, 那么会调用到类的getattr函数, 如果没有定义这个函数,那么抛出AttributeError异常)

Done
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容