结果二次封装
1、场景:
之前已经存在某个函数的功能,现在需要对其功能进行扩展,同时保留之前的功能不变,即不对原函数做任何改变
2、例如
原函数:func_1(a, b) -----> {'a': a, 'b': b}
def func_1(a, b):temp = {'a': a,'b': b}return tempif __name__ == "__main__":res = func_1(1, 2)print(res) # {'a': 1, 'b': 2}
新需求:func_2(a, b, c) -----> {'a': a, 'b': b, 'c': c}
if __name__ == "__main__":res = func_2(1, 2, 3)print(res) # {'a': 1, 'b': 2, 'c': 3}
3、方案
定义新函数,包含原函数的参数,在函数体内调用原函数(知道原函数的地址即可调用),并对原函数的返回值进行二次封装,实现如下
def func_1(a, b):temp = {'a': a,'b': b}return temp# if __name__ == "__main__":
# res = func_1(1, 2)
# print(res) # {'a': 1, 'b': 2}def func_2(a, b, c):print(type(func_1), func_1) # temp = func_1(a, b)temp.update({'c': c})return tempif __name__ == "__main__":res = func_2(1, 2, 3)print(res) # {'a': 1, 'b': 2, 'c': 3}
4、如果
原函数是某个类方法,如何在类内、类外对函数的返回值进行二次封装?使其适用于更多不同的类
原函数:a.func_a("22") -----> {'year': '2022', 'month': '10', 'day': '22'}
新需求:func_b("22", "14") -----> {'year': '2022', 'month': '10', 'day': '22', "hour": "14"}
class A:def __init__(self, year, month):self.year = yearself.month = monthdef func_a(self, day):data = {'year': self.year,'month': self.month,'day': day}return dataif __name__ == "__main__":a = A("2022", "10")res = a.func_a("22")print(res) # {'year': '2022', 'month': '10', 'day': '22'}
5、类外封装:
调用公共方法,传入参数,在公共方法中拿到原函数的地址,执行原函数得到返回值,再对返回值进行二次封装
class A:def __init__(self, year, month):self.year = yearself.month = monthdef func_a(self, day):data = {'year': self.year,'month': self.month,'day': day}return data# if __name__ == "__main__":
# a = A("2022", "10")
# res = a.func_a("22")
# print(res) # {'year': '2022', 'month': '10', 'day': '22'}def func_b(day, func, hour):temp = func(day)temp.update({'hour': hour})return tempif __name__ == "__main__":a = A("2022", "10")res = func_b("22", a.func_a, "14")print(res) # {'year': '2022', 'month': '10', 'day': '22', 'hour': '14'}
6、在面向对象的编程风格中,这种公共方法应该放在何处?
定义一个公共基类,包含一个函数,在子类中重写这个方法
class BaseClass:def __init__(self):super.__init__()def func_b(self, day, hour):returnclass A(BaseClass):def __init__(self, year, month):self.year = yearself.month = monthdef func_a(self, day):data = {'year': self.year,'month': self.month,'day': day}return datadef func_b(self, day, hour):temp = self.func_a(day)temp.update({"hour": hour})return tempif __name__ == "__main__":a = A("2022", "10")res = a.func_a("22")print(res) # {'year': '2022', 'month': '10', 'day': '22'}result = a.func_b("22", "14")print(result) # {'year': '2022', 'month': '10', 'day': '22', 'hour': '14'}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
