天天看点

__getattr__()方法实现任意调用(链式调用是特殊情况)

Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 07:18:10) [MSC v.1900 32 bit (Intel)] on win32

Type “copyright”, “credits” or “license()” for more information.

#getattr()方法,动态返回一个属性

#!!注意,只有在没有找到属性的情况下,才调用__getattr__,已有的属性,比如 name,不会在__getattr__中查找。

#注意到任意调用,如 s.abc 都会返回 None

#利用完全动态的__getattr__,我们可以写出一个链式调用

class Chain(object):

def init(self, path=’’):

self._path = path

print (path)

def getattr(self, path):

return Chain(’%s/%s’ % (self._path, path))#调用自身初始化

def str(self):

return self._path

repr = str#为了创建实例就能返回结果而不是返回方法特性

#创建实例

s=Chain()

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
__repr__ = __str__#为了创建实例就能返回结果而不是返回方法特性
           

s=Chain()

s.scor

/scor

#任意调用

s.a

/a

class Chain(object):

def init(self, path=’’):

self._path = path

print (“self._path:”,path)

def __getattr__(self, path):
	return Chain('%s/%s' % (self._path, path))#调用自身初始化
def __str__(self):
	return self._path
__repr__ = __str__#为了创建实例就能返回结果而不是返回方法特性
           

s=Chain()

self._path:

s.status

self._path: /status

/status

#status是当做一个特征参数传入到函数__getattr__(self, path)体就是path=status

#层层的调用Chain自己迭代,self._path保存了迭代值

s…status.user.timeline.list

SyntaxError: invalid syntax

s.status.user.timeline.list

self._path: /status

self._path: /status/user

self._path: /status/user/timeline

self._path: /status/user/timeline/list

/status/user/timeline/list

#层层的调用Chain自己迭代,进行不断的初始化,self._path保存了迭代值

#__getattr__动态增加了一个status属性,对实例进行调用时可以带参数

class Chain(object):

def init(self, path=’’):

self._path = path

print (“self._path:”,path)

def __getattr__(self, path):
	return Chain('%s/%s' % (self._path, path))#调用自身初始化
def __str__(self):
	return self._path
def __call__(self,s):
	return Chain('%s:%s'%(self._path,s))
           

print (Chain().status.user(‘micheal’).timeline.list)

self._path:

self._path: /status

self._path: /status/user

self._path: /status/user:micheal

self._path: /status/user:micheal/timeline

self._path: /status/user:micheal/timeline/list

/status/user:micheal/timeline/list