Python is not Java
下面简单记录其中作者提到的一些观点
1.不要将java中的静态函数 static method,转换为python中的类方法(注,类中定义的不带self参数的方法).
尽管作用相同,但是python中的类方法是用来做一些java中不能或者不好实现的效果(例如继承非默认的构造函数)
好的方案是将java中的 static method在pthon中实现为module-level function(注,模块级的全局函数,right?)
java 中的 static final 变量,应该被转换为python中的module-levle constants(模块级的常量)
这样做的好处是不需要输入麻烦的Foo.Foo.someMethod而是Foo.someMethod,调用一个class method 会带来而外的内存开销。
(注,个人认为在非纯OO(java纯OO,c/c++,python不是)的语言中,有时候完全可以用函数而不用类,类的作用在于对象所有的函数
可以拥有共享的数据变量,如果不需要对象级的变量那么对于c++用namesapce 机制 采用函数,和python中利用moudle机制采用函数
是完全可以的)
另外,要注意到 Foo.Foo.someMethod中的.是有代价的,比Foo.someMethod要慢,这是因为对于java对于每个.这些名字是在编译器查找的,
而对于python这种动态语言它是在运行期查找的,所以要付出时间代价的。
2. 需要用到swith 语句? python中的做法是用字典dict(hash table)
3.XML不是答案(注,这个我还不太懂,看原文吧)
4. 不要用getters 和 setters (注,getter如c++ inline int getNum() const { return num} )
作者认为不仅浪费cpu时间也浪费程序员时间,具体理由没太看懂:)
5. 去除程序冗余。
作者提到用闭包去除冗余,但他没有具体给出代码例子,具体怎么去除没太看懂:)
关于闭包google了一下,下面给个例子
看一下《Python 核心编程》对闭包的解释。
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被定义为闭包 。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量 。
下面程序运行结果
1
2
1
2
个人感觉闭包能使函数带有非全局的(但是类全局的变量,nonlocal)一个类似c++ static变量的感觉,其实用类对象通过对象变量完全可以模拟,不过这里就完全是函数式编程了。
1 def counter(start_at = 0):
2 count = [start_at]
3 def incr():
4 count[0] += 1
5 return count[0]
6 return incr
7
8 def counter2(s = 0):
9 count = s
10 def incr():
11 nonlocal count
12 count += 1
13 return count
14 return incr
15
16 count = counter()
17
18 print(count())
19
20 print(count())
21
22
23 count = counter2()
24 print(count())
25
26 print(count())
2 count = [start_at]
3 def incr():
4 count[0] += 1
5 return count[0]
6 return incr
7
8 def counter2(s = 0):
9 count = s
10 def incr():
11 nonlocal count
12 count += 1
13 return count
14 return incr
15
16 count = counter()
17
18 print(count())
19
20 print(count())
21
22
23 count = counter2()
24 print(count())
25
26 print(count())