Pycharm 说所有的 attribute 都要在 __init__ 里定义?

2016-07-02 21:56:12 +08:00
 thekoc

如果你不这么做, 它会抱怨: Instance attribute xxx defined outside init

这是正确的做法么? 比如在写一个界面的时候, init 里就会有许许多多的代码来初始化界面, 这个时候更好的办法难道不是把它们分散到好几个不同的函数中去初始化么?

11186 次点击
所在节点    Python
9 条回复
justou
2016-07-02 22:09:24 +08:00
在 settings > editor > inspections > python 里面各种开关可以自己勾选, 有些勾上还是挺有用的, 例如要写兼容 py2,py3 的代码
petelin
2016-07-02 22:11:51 +08:00
我觉得他的意思是所有的变量都得在 init 函数里声明。这样确实更好。不会出现调用未创建的变量。你把函数分开然后也都在 init 里调用道理一样的。
shyling
2016-07-02 22:19:51 +08:00
意思是最少在__init__里定义一个名字,在其他方法使用时就至少不会不存在
LPeJuN6lLsS9
2016-07-02 22:32:46 +08:00
分散掉的那几个函数如果仅仅是在__init__里调用的话何必分散?可以把它们全塞进 init ,然后用# -------- 某功能 --------这样的注释和几个空行隔开。视觉效果不比分散差
thekoc
2016-07-02 23:03:26 +08:00
@shyling 定义一个名字的意思是说赋值 None 么?
VicYu
2016-07-03 00:32:20 +08:00
PyCharm 上有很多很实践的提示,可以多勾选试试
lowzoom
2016-07-03 10:26:01 +08:00
构造方法里做赋值以外的事情,是 bad smell ,会降低代码的可测试性
thekoc
2016-07-03 17:24:54 +08:00
@lowzoom 那难道正确的做法是在 init 里赋值但是在子函数里去做初始化操作?这不就成了 cpp 了…
lowzoom
2016-07-03 22:20:52 +08:00
@thekoc 非也,根据 SRP 原则,你这个类本来就会承担某个界面逻辑,那么它就不应该再承担“初始化”的职责,初始化的工作应该在另一个单独的类中完成,也就是烂大街的“工厂模式”,这样能让代码更可测(也就是更好写单元测试)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/289865

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX