python修炼day38!

本文阅读时长大约为 11 分钟

今日内容概述:

多继承及 MRO 顺序 | **args、**kwargs | 类对象、实例对象、类属性、实例属性、实例方法、静态方法、类方法 | 内置方法 | property属性 | 魔法属性 | 面向对象设计 | with 上下文管理器 | 面向对象回顾 | GIL 全局解释器锁回顾

今日内容

一、多继承及 MRO 顺序

使用父类名调用:父类的父类会执行多次

super在多继承中的作用:

_mro_内置属性: 多继承时,输出调用父类方法是顺序 由C3 算法决定

使用 super 调用:父类的父类只需执行一次

二、**args **kwargs

多值参数 拆包、解包

形参时是接收:

*args :接收的是一个元组

**kwargs:接收的是一个字典,由键值对的方式给值

实参时是拆包:

*args:把元组拆成一个个元素值

**kwargs:把字典拆成键值对

三、类对象、实例对象、类属性、实例属性、实例方法、静态方法、类方法

类属性修改只能由类名来操作

实例对象可以用类属性,不能修改,修改就相当于新建了一个实例属性

@staticmethod @classmethod

调用类相关的内容和静态方法推荐使用类名来调用

类属性在内存中保存一份

实例属性在每个对象中都要保存一份

实例方法:由对象调用;至少一个self参数;执行实例方法时,自动将调用该方法的对象赋值给self;

类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类赋值给cls;

静态方法:由类调用;无默认参数;

四、内置方法

不需要程序员调用,python解释器触发某个条件时调用

def _xxx_(self):

私有类属性可以通过 类名.类名_属性名 来访问

五、property属性

使用:在实例方法的基础上添加 @property 装饰器,

可以像调用一个实例属性一样调用实例方法 调用时不需要括号

这个实例方法不要多写参数

使用 property 后,调用时不需要传递参数。

property 属性的两种方式

1.装饰器方式

@property: 获取

@price.setter: 设置 必须两个参数

@price.deleter:删除

经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法

新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法

由于新式类中具有三种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除

2.property-类属性

建议使用这一种

property方法中有个四个参数

第一个参数是方法名,调用 对象.属性 时自动触发执行方法

第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法

第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法

第四个参数是字符串,调用 对象.属性.doc,此参数是该属性的描述信息

六、魔法属性

私有属性,名字重整

魔法属性:

七、面向对象设计

继承 - 是基于Python中的属性查找(如X.name)

多态 - 在X.method方法中,method的意义取决于X的类型

封装 - 方法和运算符实现行为,数据隐藏默认是一种惯例

八、with 上下文管理器

使用 with 打开文件,当离开 with 代码块的时候,系统会自动调用 close() 方法,可以避免使用普通方法打开文件时出现异常无法关闭文件的现象。

上下文管理器

任何实现了 _enter__() 和 \_exit__() 方法的对象都可称之为上下文管理器,上下文管理器可以使用 with 关键字。

实现上下文管理的另一种方式

面向对象回顾面向对象概念

面向过程:做一件事从头到尾都要关心

面向对象:做一件事不关心过程,只关心结果

类:一类事物,一个抽象的概念

对象:是类的具象化

特征(属性)相当于一个变量、功能行为(方法)相当于函数

封装继承多态

封装:

高内聚:把相关功能尽量放在一个类中

低耦合

继承:

概念:子类可以拥有父类的属性和方法

作用:减少代码的书写,提高代码阅读性

单继承:可以一直向下传递

多继承:一个子类可以继承多个父类

方法重写

多态:

一个对象有多种形态

条件:继承和方法的重写

增强代码的灵活性

列表推导式

GIL 全局解释器锁

多任务是指同一时刻可以执行多个任务。

协程开销最小,线程在中,进程消耗最大

协程基于线程,线程基于进程

GIL 同一时刻只允许一个线程在执行。假的并发。多进程每个核消耗占一半,一共100%。

这个问题和python语言没有关系

只在c语言写的 cpython解释器中有这个问题

计算密集型、IO操作

解决:换其他解释器、在需要的位置调用其他语言。

深拷贝、浅拷贝

= 是指向;

copy.copy() 浅拷贝复制引用,不复制数据,节约内存,源数据修改会被影响;

copy.deepcopy() 深拷贝复制数据,不会污染源数据,会占用内存。

列表拷贝,深是深,浅是浅

元组拷贝,两种拷贝都是指向

字典、切片、字符串都是浅拷贝

私有化

作用:数据安全,避免重名

_xxx: 私有属性,防止被导入

__xxx: 私有属性,只在本类中可以用,

_xxx_: 魔法属性, 不能随便定义

xxx__: 避免与关键字冲突

java 语言的私有属性: public int a=5; private String=”aaa”

模块导入

from … import 变量 类似于深拷贝

import 模块 类似于浅拷贝

今日内容多且杂,而且必须记忆,太多了,不好记,慢慢来吧.......

最近总感觉不在状态,有生理原因也有心理原因,需要调节一下。

END

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180826G13LW800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券