用node作了点儿小东西之后,开始发现很多东西不明白,尤其是设计思路上的一些问题,包括在后端开发中的一些看似约定俗成的原理,使用前端的思维理解起来确实比较困难。再加上最近工作不是特别忙,所以打算在闲暇有精力的时候,选一门后端语言看看,选来选来发现大家都说python比较好入门,所以就决定先从python开始。
因为本身不算是计算机科班出身,也没接受过什么正经的开发训练,从切页面开始到现在,说实话只能算是对js这门语言有亲切感,不论看什么问题的思路也被限制在了js中,不过好在几天学习下来,感觉python和js还是有很多共通之处的,尤其是最新版本的js(也就是使用了ECMA5规范的)。
下面还是来说说一个前端工程师眼中的python吧:
先说几个跟js中相同的关键字:
#####with 先来看js中的with
,在js中with
的主要作用是改变函数或者方法运行的作用域,如下代码所示:
var Obj = {
'name' : 'A',
'age' : '2',
'getName' : function () {
console.log(this.name)
}
};
with(Obj) {
console.log(name);
console.log(age);
getName();
}
结果分别是:
A
20
A 可以看出在js中,`with`之后的`{}`之中的代码块,是在`(Obj)`这个作用域内执行的,其中的`this`也指向了`Obj`这个变量。
再来看python中的with
,最早看到这个关键字是在这样一段代码中:
with open(path/to/file) as f:
print f.read()
主要功能是可以替换try
:
try
f = open(path/to/file)
print f.read()
finally
if f:
f.close()
但是现在看来with
的主要功能并不仅仅是这个,虽然可以替代try
是一个方面,于是我又查找了一些with
的其他用法,大致意思是这样:
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
但是with
还可以跟上下文管理器
一起协作,完成在特定上下文环境中执行代码块。具体内容可以参考这篇文章。
这里简单的说一下,所谓的上下文管理器
,可以理解成是一个包含__enter__
和__exit__
方法的对象,在with
中的代码执行之前,会先执行__enter__
方法,然后将作用域切换到所在的上下文中,在代码执行完毕之后,执行__exit__
方法,释放该作用域。
#####self & this 在pyton中,所有类的方法第一个参数都是self
,这个self
指向当前实例。
在js中,this
的指向更为广泛,指向的位置,确切的说应该是代码的运行环境。不过在为原型定义方法时,在方法中this
的指向也是当前的实例。
#####prototype & mateclass
在js中,通常来说,我们要创建一个所谓的类
,是这么定义的:
var Cls = function cls() {
// code
};
Cls.prototype = {
constructor : Cls,
init : function () {}
// 其他方法
...
}
var cls = new Cls();
在python中,通过class
来定义类,但是还可以通过metaclass
来制定class
的公用方法。metaclass
也可以理解为class
的prototype
,即元对象,我们可以这么定义对象:
class Cls(object) :
__metaclass__ = MetaCls
def __init__ (self) :
pass
class MetaCls(type) :
def __new__(cls, name, bases, attrs)
pass
cls = Cls();
看起来有没有很相似?
python中的metaclass
更智能的把js中的关键字new
作为了入口函数,同时也把init
作为了构造函数,写在了class中。