偏函数:
偏函数是functools模块提供的一个功能,偏函数可以通过设定参数的默认值,降低函数调用的难度
其中设定的参数默认值实际上是可以被传入为其他值的,最后创建偏函数时可接收函数对象、*args、
**kw三个参数
import functools functools.partial(int,*args/**kw)
Python模块章节:模块是一组python代码的集合,可以使用其他模块,也可以被其他模块使用。
常见自己的模块时要注意:模块名要遵循Python变量命名规范,不要使用中文、特殊字符;
模块名不要和系统模块名冲突,可以在python交互环境执行import abc,若是成功则说明系统存
在这个模块。(模块实际上就是一个.py文件)
使用模块:知道导入模块,然后就可以调用模块中的函数了,模块中的函数有些是不想公开的,
不应该被直接引用,类似_xxx和__xxx这样的函数就是非公开的,所以在定义函数的时候可以将
私有函数,实际上python也没有一种确定方法来显示函数的引用,所以只能从变成习惯上来控制
所以可以在定义函数时通过在模块中利用公开函数去调用私有函数,这样外部使用的时候就不用
关心私有函数细节,形成一种封装的效果,一般的习惯是外部不需要的函数全部定义为private,
只有外部需要的函数才定义为public。
安装第三方模块:下载安装就可以了,Anaconda比较好。
面向对象编程:类和实例,举一个例子就是鸟是一个类,但是一只鸟就是一个实例,每个实例
数据互相独立,方法是和实例绑定的函数,方法可以直接访问实例的数据。定义好一个类之后,
可以创建实例,依靠类名+()实现。
访问限制:在class内部的方法和属性,可以被外部代码自由修改,为了避免,可以让内部的属性
私有化,在实例属性前加上双下划线,属性就变成仅供内部访问,外部不能访问,此时就要利用
get和set方法去访问和操作属性。python中变量名类似__xxx__的,是特殊变量。一个下划线开头
的实例变量名是可以被外部访问的,但是这种表达方式本身的意义就是虽然自身可以被访问,但
是请不要随意访问并希望被视为私有变量。不能访问的__xxx是因为python解释其把变量名修改成
_(类名)__xxx,所以依然是可以被访问的,所以python是没有机制去阻止的,一切都靠自己自觉。
继承和多态:大概意思和java中类似,然后的话有一个不同点就是,多态在python中的体现跟java
里面不一样,比如定义一个run(x)函数,x在java中是需要指定数据类型的,但是在python中是
没有一个确定的数据类型的,x可以是任意的数据类型,只要该类中定义了run中的方法,就可以调用
run()方法并使用。
获取对象信息:有三种方法,使用type(),返回参数相应的类型;使用isinstance(),用来判断一个class
是否为某一特定类型;使用dir(),可以获得一个对象的所有属性和方法,配合getattr(obj,'xxx',404)、setattr()、hasattr()
方法可以直接操作一个对象的状态。obj为对象,xxx是需要确认的东西,404为返回值,在setattr中第三
个为个人设定值。
实例属性和类属性:实例属性是属于各自的,互不干扰;类属性是类共有的,所有实例共享一个属性。
面向对象高级编程:使用__slots__:由于python语言的动态性,可以给一个实例绑定任何属性和方法,
也可以给类绑定方法,为了避免这种情况,就可以使用__slots__变量,在类中定义gg
class Student(object): __slots__ = ('name','age') #用tuple定义允许绑定的属性名称
这样就可以指定绑定的属性,但是这样对子类是没有影响的,如果子类也定义了子类就共享父类的绑定
使用@property:在类中,为了限制一个参数的输入范围可以在setter方法中添加限制条件,这样参数
的赋值就不能那么随意了,但是直接操作会使得代码没那么美观优雅,用@property可以变得简单,
class Student(object): @property def birth(self): return self._birth @birth.setter def birth(self, value): self._birth = value @property def age(self): return 2015 - self._birth
用@property可以把一个getter()方法变成属性,另一个@score.setter装饰器把setter方法变成属性赋值,
如果只定义getter()方法不定义setter()方法,该属性就变成一个只读属性。
class Student(object): @property def score(self): return self._score @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value >>> s = Student() >>> s.score = 60 # OK,实际转化为s.set_score(60) >>> s.score # OK,实际转化为s.get_score() 60 >>> s.score = 9999 Traceback (most recent call last): ... ValueError: score must between 0 ~ 100!
多重继承:感觉类似java接口,可以实现不同的功能,不过不同的是这个是利用一个继承的方式来实现功能
,MixIn是一种常见的设计,选择组合不同的类功能,可以快速构造出符合需求的子类。