python3 定制类的学习记录(REST API, url)
2019-01-24 本文已影响0人
fordG
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异常)