栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

我如何避免“ self.x = x; self.y = y; __init__中的self.z = z”模式?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

我如何避免“ self.x = x; self.y = y; __init__中的self.z = z”模式?

编辑:如果您有python
3.7+,只需使用数据类

保留签名的装饰器解决方案:

import decoratorimport inspectimport sys@decorator.decoratordef simple_init(func, self, *args, **kws):    """    @simple_init    def __init__(self,a,b,...,z)        dosomething()    behaves like    def __init__(self,a,b,...,z)        self.a = a        self.b = b        ...        self.z = z        dosomething()    """    #init_argumentnames_without_self = ['a','b',...,'z']    if sys.version_info.major == 2:        init_argumentnames_without_self = inspect.getargspec(func).args[1:]    else:        init_argumentnames_without_self = tuple(inspect.signature(func).parameters.keys())[1:]    positional_values = args    keyword_values_in_correct_order = tuple(kws[key] for key in init_argumentnames_without_self if key in kws)    attribute_values = positional_values + keyword_values_in_correct_order    for attribute_name,attribute_value in zip(init_argumentnames_without_self,attribute_values):        setattr(self,attribute_name,attribute_value)    # call the original __init__    func(self, *args, **kws)class Test():    @simple_init    def __init__(self,a,b,c,d=4):        print(self.a,self.b,self.c,self.d)#prints 1 3 2 4t = Test(1,c=2,b=3)#keeps signature#prints ['self', 'a', 'b', 'c', 'd']if sys.version_info.major == 2:    print(inspect.getargspec(Test.__init__).args)else:    print(inspect.signature(Test.__init__))


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/625259.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号