学习python的日常4

偏函数:

偏函数是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是一种常见的设计,选择组合不同的类功能,可以快速构造出符合需求的子类。

原文地址:https://www.cnblogs.com/zzy0306/p/7955054.html