最近一段时间一直在研究openstack的源码,所以对python语言也在逐渐的熟悉(之前一直是在用java)。今天这篇文章来总结一下python语言的一些特性吧。
一、 特殊函数:
python语言约定,函数名以“_”(单下划线)开头的为受保护函数,只有类本身和子类可以访问到,相当于java中的protected关键字;函数名以“__”(双下划线)开头的为私有函数,只有类本身可以访问到,相当于java中的private关键字。这一约定也同样适用于变量。
1. __new__(cls, *args, **kwargs)
__new__函数在类实例化时被调用,cls代表要实例化的类,函数返回实例化出来的实例,通常__new__函数会在类实例化时被隐式的调用。
2. __init__(self, *args, **kwargs)
__init__函数类似于java中的构造函数,类在初始化(实例化)后会调用该函数。但__init__函数只是类似于一个构造函数,因为函数在调用之前已经生成了类的对象,而实现这一功能的就是__new__函数。
3. __call__(self, *args, **kwargs)
__call__函数是python中特有的函数,只要在定义类的时候实现了__call__函数,这个类就成为可调用的,也就是我们可以把这个类当做函数来使用。
注:在python中“*”和“**”有特殊的含义,它并不代表C/C++中的指针,python中的“*”和“**”主要在函数声明或调用作为函数的参数,“*”代表元组或列表,“**”代表字典。
来看一个非常简单的例子:
class Animal(object):
def __init__(self, name, legs):
self.name = name
self.legs = legs
self.foods = []
def __call__(self, food):
self.foods.append(food)
场景类
cat = Animal('cat', 4)
dog = Animal('dog', 4)
cat('fish')
print cat.foods
dog('bone')
dog('meat')
print dog.foods
输出结果
['fish']
['bone','meat']
二、 装饰器
python规定在类或函数前有“@”修饰,称之为装饰器。装饰器的作用有点类似java中的拦截器,先把函数包装成另一个函数,最后再返回包装之前的函数。这么说有些生涩,下面是一个简单的装饰器应用的例子。
def pre_action(func):
def warpper(x):
return(func(x) * x)
return warpper
@pre_action
def action(x):
return x
action(3) #输出结果为9
pre_action函数返回一个warpper函数的引用,装饰器等同于action=pre_action(action),action(3)相当于执行了warpper(3),所以返回结果为9。
三、 with语句
with语句是python 2.5新增的新特性,用于简化try...except...finally处理流程。with语句后的函数必须包含__enter__和__exit__两个方法,引入with语句后,在执行前,会先执行with语句后函数的__enter__方法,执行完成后,会执行其__exit__方法。with语句很好理解,其实它也类似于一个拦截器,把拦截工作放入__enter__中处理,清理工作放在__exit__中处理。
下面看一个给文件加锁的例子
class LockContext(object):
__init__(self, lock):
self.lock = lock
__enter__(self):
self.Lock()
__exit__(self, type, value, traceback):
if type != None:
process_except()
self.Unlock()
return false
with LockContext(lock) as lock:
.......
as后的变量用于接收返回值,可以看到应用with语句后,代码清晰了很多,我们不必在每个需要加入/释放文件锁的地方重复的编写代码,只需要引入with语句即可,而且这样的书写方法会大大减少因为忘记释放文件锁而导致的内存泄露问题。