学习python的平常4

偏函数:java

偏函数是functools模块提供的一个功能,偏函数能够经过设定参数的默认值,下降函数调用的难度python

其中设定的参数默认值其实是能够被传入为其余值的,最后建立偏函数时可接收函数对象、*args、编程

**kw三个参数函数

import functools
functools.partial(int,*args/**kw)

Python模块章节:模块是一组python代码的集合,可使用其余模块,也能够被其余模块使用。设计

常见本身的模块时要注意:模块名要遵循Python变量命名规范,不要使用中文、特殊字符;对象

模块名不要和系统模块名冲突,能够在python交互环境执行import abc,如果成功则说明系统存blog

在这个模块。(模块实际上就是一个.py文件)继承

使用模块:知道导入模块,而后就能够调用模块中的函数了,模块中的函数有些是不想公开的,接口

不该该被直接引用,相似_xxx和__xxx这样的函数就是非公开的,因此在定义函数的时候能够将get

私有函数,实际上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是一种常见的设计,选择组合不一样的类功能,能够快速构造出符合需求的子类。

相关文章
相关标签/搜索