diff --git a/11 概念认知/函数/2 临时变量传递.py b/11 概念认知/函数/2 临时变量传递.py index 0b7d0e3..1059799 100644 --- a/11 概念认知/函数/2 临时变量传递.py +++ b/11 概念认知/函数/2 临时变量传递.py @@ -23,6 +23,5 @@ if __name__ == "__main__": word_list = extractwords( txtcontent ) word_freqs = frequencies( word_list ) word_sorts = sort ( word_freqs ) - for tf in word_sorts[:10]: print(tf[0], '-', tf[1]) \ No newline at end of file diff --git a/11 概念认知/函数/3 连续调用.py b/11 概念认知/流式调用/1 连续调用.py similarity index 100% rename from 11 概念认知/函数/3 连续调用.py rename to 11 概念认知/流式调用/1 连续调用.py diff --git a/11 概念认知/函数/4 连续调用.py b/11 概念认知/流式调用/2 嵌套调用.py similarity index 100% rename from 11 概念认知/函数/4 连续调用.py rename to 11 概念认知/流式调用/2 嵌套调用.py diff --git a/11 概念认知/尾调用/1 方法bind.py b/11 概念认知/流式调用/3 方法bind.py similarity index 69% rename from 11 概念认知/尾调用/1 方法bind.py rename to 11 概念认知/流式调用/3 方法bind.py index 95300c9..2df6ba5 100644 --- a/11 概念认知/尾调用/1 方法bind.py +++ b/11 概念认知/流式调用/3 方法bind.py @@ -3,7 +3,7 @@ from cppy.cp_util import * # 如果有连续的对数据加工操作,而且总是把共同加工数据对象当第一个参数,可以用本文件夹方法提升阅读体验 # 框架类 -class FunFlow: +class FunBind: def bind(self, func,*args, **kwargs): try: self.data = func(self.data,*args, **kwargs) @@ -12,14 +12,13 @@ class FunFlow: return self -if __name__ == "__main__": - data = FunFlow()\ - .bind(extract_file_words,testfilepath)\ - .bind(get_frequencies)\ - .bind(sort_dict)\ - .bind(print_word_freqs,10)\ - .data - print(data) +data = FunBind()\ + .bind(extract_file_words,testfilepath)\ + .bind(get_frequencies)\ + .bind(sort_dict)\ + .bind(print_word_freqs,10)\ + .data +print(data) ''' 函数是自由函数,还是正常的函数写法 diff --git a/11 概念认知/尾调用/2 重载.py b/11 概念认知/流式调用/4 重载管道.py similarity index 100% rename from 11 概念认知/尾调用/2 重载.py rename to 11 概念认知/流式调用/4 重载管道.py diff --git a/11 概念认知/尾调用/3 类方法.py b/11 概念认知/流式调用/5 类方法.py similarity index 82% rename from 11 概念认知/尾调用/3 类方法.py rename to 11 概念认知/流式调用/5 类方法.py index 3c581f1..f124fb2 100644 --- a/11 概念认知/尾调用/3 类方法.py +++ b/11 概念认知/流式调用/5 类方法.py @@ -24,7 +24,6 @@ Flow().extract_file_words(testfilepath).get_frequencies().sort_dict().print_word ''' 连续方法调用,看起来比较舒服 但是需要假设: - - 每一个类方法返回 self - - 类方法默认不写第一个参数 -约束使得不符合使用习惯 + - 每一个类方法返回 self :否则,没法连续 + - 类方法默认不写第一个参数,数据都在 .data 里面 ''' \ No newline at end of file diff --git a/11 概念认知/流式调用/6 类方法.py b/11 概念认知/流式调用/6 类方法.py new file mode 100644 index 0000000..4de00c1 --- /dev/null +++ b/11 概念认知/流式调用/6 类方法.py @@ -0,0 +1,50 @@ +from cppy.cp_util import * + +# 装饰器改写类 +# - 找到以f_开头的方法 +# - 将方法函数的返回值赋值给对象的data属性 +# - 返回对象自身 +def return_self_decorator(cls): + def return_self(func): + # 定义一个闭包函数,用于接收参数 + def wrapper(self, *args, **kwargs): + self.data = func(self, *args, **kwargs) + return self # 返回类自身 + return wrapper + + for name, method in cls.__dict__.items(): + # 判断属性是否可调用,且属性名以f_开头 + if callable(method) and name.startswith('f_'): + # 为类改写属性,将封装后的函数赋值 + setattr(cls, name, return_self(method)) + return cls + +@return_self_decorator +class Flow(): + def test(self): + return 'test' + + def f_extract_file_words(self, filepath): + return extract_file_words(filepath) + + def f_get_frequencies(self): + return get_frequencies(self.data) + + def f_sort_dict(self): + return sort_dict(self.data) + + def f_print_word_freqs(self, n): + print_word_freqs(self.data, n) + + +# 顺序调用 +Flow().f_extract_file_words(testfilepath).f_get_frequencies().f_sort_dict().f_print_word_freqs(10) + +''' +改写后,参与 function flow 功能的方法 + - 需要以 'f_' 开头 + - 类方法默认不写第一个参数,数据都在 .data 里面 + +仍旧需要特殊的方法写法 +所以,还是 1,2种方法比较自然 +''' \ No newline at end of file