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

你可能感兴趣的:(python3 定制类的学习记录(REST API, url))