Discuss / Python / 记录一下

记录一下

Topic source

XHS_12302

#1 Created at ... [Delete] [Delete and Lock User]

通过:1,定义users方法,2 __getattr__()可以返回方法,3 使用__call__() 等方式来完成链式调用

# -*- coding: utf-8 -*-
#import sys

"""
1,定义users方法
"""

class Chain(object):
	
	def __init__(self, path=''):
		self.__path = path
	
	def __getattr__(self, item):
		return Chain('%s/%s' % (self.__path, item))
	
	def users(self, name):
		# 使用sys._getframe().f_code.co_name 可以得到当前函数名称'users'
		# return Chain('%s/%s/%s' % (self.__path, sys._getframe().f_code.co_name, name))
		return Chain('%s/%s/%s' % (self.__path, 'users', name))
	
	def __str__(self):
		return self.__path
		
	__repr__ = __str__
					 
print(Chain().users('michael').repos)

# -*- coding: utf-8 -*-

"""
2,使用__getattr__()返回方法
"""

class Chain(object):
	
	def __init__(self, path=''):
		self.__path = path
	
	def __getattr__(self, item):
		if item == 'users':     # item 暂时我还不能动态判断是否是方法或者属性,只能写死判断
			return lambda value: Chain('%s/%s/%s' % (self.__path, item, value))
		return Chain('%s/%s' % (self.__path, item))
	
	def __str__(self):
		return self.__path
			
	__repr__ = __str__
					 
print(Chain().users('michael').repos)

# -*- coding: utf-8 -*-

"""
3,使用__call__()方法
"""

class Chain(object):
	
	def __init__(self, path=''):
		self.__path = path
	
	def __getattr__(self, item):
		return Chain('%s/%s' % (self.__path, item))
	
	def __call__(self, name):
		return Chain('%s/%s' % (self.__path, name))
	
	def __str__(self):
		return self.__path
		
	__repr__ = __str__
					 
print(Chain().users('michael').repos)

讷讷-孟

#2 Created at ... [Delete] [Delete and Lock User]
if item == 'users':     # item 暂时我还不能动态判断是否是方法或者属性,只能写死判断
			return lambda value: Chain('%s/%s/%s' % (self.__path, item, value))

这段 lambda 表达式 没看懂,这个value 是怎么传入进来??

这里不是传value进来,而是返回一个函数。具体可以返回__getattr__看。

我们将返回的函数名称为func,函数逻辑是:

def func(value):
    return Chain('%s/%s/:%s' % ('status','user',value) 
    # Chain('%s/%s/:%s' %(self._path,path,value))

至于这里我直接将self._path和path的值写出来是为了方便看,具体为什么请返回看返回函数节的闭包内容。

而Chain().status.user等同于func,那么Chain().status.user('Mike')就等同于func('Mike')了。调用函数,返回Chain的一个实例,继续处理后面的内容。

我一直在思考用lambda来写这个方法,因为毕竟__call__是后面的教程。先感谢,再来看。


  • 1

Reply