V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Tianny
V2EX  ›  Python

问个如何优雅初始化类的问题

  •  
  •   Tianny · 2018-03-29 14:27:01 +08:00 · 1803 次点击
    这是一个创建于 2431 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Class A:
        def __init__(self, **kwargs):
            self.__dict__.update(kwargs)
    
    A(a=1, b=2)
    

    -----------------------分割线------------------

    Class A:
        def __init__(self, a, b):
            self.a = a
            self.b = b
    
    data = {'a':1, 'b':2}
    A(**data)
    

    第一种方式 __init__ 方法虽然很简单,不用写那么多参数,但是真正初始化实例的时候依然要按键值对方式传入,如果有十几个,就得诶个手写传入。

    第二种方式,虽然真正初始化实例时传个字典就可以了,但是 __init__方法事先给定了属性名称,如果有很多,也要诶个写进去。

    有没有两者兼得的方法呢?也就是

    Class A:
        def __init__(self, **kwargs):
            self.__dict__.update(kwargs)
    

    但是初始化的时候,可以不用诶个传属性-值进去。

    讲的可能有点乱,不知道表达清楚没有

    8 条回复    2018-03-30 15:13:02 +08:00
    justou
        1
    justou  
       2018-03-29 15:19:25 +08:00   ❤️ 2
    如果真的只有少量参数, 用第二种, 简单明了, IDE 里面的提示可以很清楚的看到有哪些参数要传, 最怕的是出现这种提示: func(*args, **kwargs), 丁点儿提示都没有呀! 除了翻文档还能干啥, 忘一次翻一次;

    如果有大量参数, 怕是把一些相关的参数抽象到单独的类中更好哦(现在想想 matplotlib 的 api 用起来略烦人);

    还有, "传个字典就可以了"这种想法要三思, 用在复杂系统中会直接导致程序逻辑不清晰, 重构困难(有时看到满屏的字典在飞就会想: 重构? 怕是重新撸一个更轻松哦), 稳健性超低, 改一个地方可能导致 N 个地方都要改, 字典当成纯粹的数据结构用就好了, OOP 还是多抽象跟封装.
    jmc891205
        2
    jmc891205  
       2018-03-29 16:02:30 +08:00
    第一种也可以传字典进去啊
    qsnow6
        3
    qsnow6  
       2018-03-29 16:27:44 +08:00
    第二种逻辑清晰,易于重构
    balamiao
        4
    balamiao  
       2018-03-29 16:54:09 +08:00
    python 还需要这么麻烦,多参数?
    xpresslink
        5
    xpresslink  
       2018-03-29 22:29:33 +08:00
    没听说过大量参数还优雅一说,楼主确定是参数而不是数据?
    fanhaipeng0403
        6
    fanhaipeng0403  
       2018-03-30 10:15:16 +08:00   ❤️ 1
    attrs 库
    nametuple
    troywinter
        7
    troywinter  
       2018-03-30 14:04:32 +08:00
    如果你设计的类参数很多,那说明这个类设计的有问题,参考 clean architecture 前面几章。
    Tianny
        8
    Tianny  
    OP
       2018-03-30 15:13:02 +08:00
    @troywinter 好的 谢谢~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2860 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:56 · PVG 16:56 · LAX 00:56 · JFK 03:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.