python的高阶函数
一个函数作为另外一个函数的参数、map()、reduce()、filter()、自定义排序函数、一个函数返回另外一个函数作为返回值
闭包
匿名函数
装饰器 类似于java的aop
1.利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用
2.如果要让调用者看不出一个函数经过了@decorator的“改造”,就需要把原函数的一些属性复制到新函数中,Python内置的functools可以用来自动化完成这个“复制”的任务
import functools
def log(f):
@functools.wraps(f)
def wrapper(*args, **kw):
print 'call...'
return f(*args, **kw)
return wrapper
偏函数
functools.partial可以把一个参数多的函数变成一个参数少的新函数,少的参数需要在创建时指定默认值,这样,新函数调用的难度就降低了。
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85
包、模块
模块:python文件
包:多个python文件的文件夹,必须有一个init.py文件
# from 模块 import 函数
from math import pow, sin, log #可以直接引用 pow, sin, log 这3个函数
from logging import log as logger # logging的log现在变成了logger,别名
future
当新版本的一个特性与旧版本不兼容时,该特性将会在旧版本中添加到future中,以便旧的代码能在旧版本中测试新特性。
python面向对象
按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的
class Person(object):
pass
python面向对象 __init()方法
python定义的类中如果一个属性由双下划线开头(__),该属性就无法被外部访问
python定义的类中如果一个属性由双下划线开头(__),该属性就无法被外部访问,但是,如果一个属性以 "__xxx__" 的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。
以单下划线开头的属性"_xxx"虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。
类属性
当实例属性和类属性重名时,实例属性优先级高
实例属性
实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的;
在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,这种数据封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度;
python中定义类方法
通过标记一个 @classmethod,该方法将绑定到 Person 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.count 实际上相当于 Person.count。
class Person(object):
count = 0
@classmethod
def how_many(cls):
return cls.count
def __init__(self, name):
self.name = name
Person.count = Person.count + 1
print Person.how_many()
p1 = Person('Bob')
print Person.how_many()
python 继承、多态、多重继承
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
>>> isinstance(p, Person)
True # p是Person类型
python中获取对象信息
dir()、filter()、getattr()、setattr()函数
python中特殊方法
str()、repr()、cmp() 用与自定义实体类比较器、len()、类型转换、限制属性slots()、call()
面向对象常见的get、set方法():@property
#注意:
#第一个score(self)是get方法,用@property装饰,
#第二个score(self, score)是set方法,用@score.setter装饰,@score.setter是前一个@property装饰后的副产品。
class Student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
@property
def score(self):
return self.__score
@score.setter
def score(self, score):
if score < 0 or score > 100:
raise ValueError('invalid score')
self.__score = score
网友评论