第四章:Python面向对象--核心重点总结1(详解)

第四章 面向对象核心重点总结

作者:数据分析玩家 2018年7月21日23:19:10

 

问题1:在类内部定义的方法分为两种:绑定方法和非绑定方法,简述相应的概念以及特点

在类内部定义的方法分为两种:绑定方法和非绑定方法,绑定方法具有自动传值的功能,非绑定方法没有自动传值的功能

绑定方法绑定给谁,谁来调用就自动将它本身当做第一个参数传入,绑定方法又分为绑定到对象身上的方法和绑定到类身上的方法。

通过staticmethod装饰器装饰的方法为非绑定方法,即普通函数。

非绑定方法就是类内部的一个普通函数而已,类和类对象都可以进行调用,非绑定方法没有自动传值的功能,该传入几个参数就是几个参数。

 

问题2:在Python当中,简述对象绑定方法和类绑定方法的概念

通过classmethod装饰器装饰的方法为绑定到类身上的方法,自动将类当做第一个参数传入,绑定到类身上的方法也可以被对象进行调用,但是仍自动将类当做第一个参数传入。

没有被任何装饰器装饰的方法为绑定到对象身上的方法,自动将对象当做第一个参数传入,绑定到对象身上的方法也可以被类进行调用,此时将没有自动传值的功能,该传入几个参数就传入几个参数。

 

问题3:在Python当中,简述对象绑定方法、类绑定方法、静态方法的使用场景
如果这个函数既不需要cls参数、也不需要self参数,那么这个方法就是静态staticmethod方法。

如果这个函数需要将类自动传入进去,才能够进行操作,那么这个方法就是绑定到类身上的方法。

如果这个函数需要将对象自动传入进去,才能够进行操作,那么这个方法就是绑定到对象身上的方法。

 

静态绑定方法 ===> 类绑定方法 ==>  对象绑定方法

注意:凡是类中的方法或函数,默认情况下都是绑定给对象使用的。

 

问题4:什么是反射.

通过字符串的形式来寻找或操作对象内部的属性,在python当中一切事物皆对象,所以都可以使用反射。

通过字符串映射或者修改程序运行时的状态、属性或者方法.

反射是通过字符串的形式操作对象相关的成员,反射的的本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!

python中的反射功能涉及到四个内置函数:hasattrgetattrsetattrdelattr,这四个函数分别用于对对象内部执行:检查是否含有某个成员、获取成员、设置成员、删除成员。

 

问题5:简述反射的应用场景.

在程序当中,如果我们想通过一个字符串变量var来导入一个模块或者一个模块下的某个方法,这个时候直接执行import var是会报错的,因为var在程序当中是一个变量,通过字符串变量来直接调用名字看起来相同的函数是不可行的,这个时候就需要使用到反射。

根据用户输入的url的不同,调用不同的函数,实现不同的操作,也就是一个web url路由器的功能,这在web框架里是核心部件之一。

 

问题6Python当中的反射涉及到了四个主要方法,简述相应的用法

hasattr(obj,name_str):判断对象obj是否含有名为name_str的方法或者静态属性,返回值为布尔值,即通过字符串的形式来判断对象内部是否含有某个属性。
getattr(obj,name_str):根据字符串name_str去获取对象obj当中对应函数的内存地址或者静态属性对应的数值,如果返回值为函数的内存地址,需要加上括号才能够调用。
setattr(obj,name_str,value): 添加或者修改obj对象当中名为name_str属性或者方法的数值。

delattr(obj,name_str): 删除obj对象当中名为name_str属性。

 

问题7:简述Python2Python3当中经典类与新式类的概念

1)只有在Python2当中才分为新式类与经典类,在Python3当中统一都是新式类

2)在Python2当中,没有显示的继承object类的类,以及该类的子类,都是经典类

3)在Python2当中,显示的声明继承object类的类,以及该类的子类,都是新式类

4)在Python3当中,无论是否显示的继承object类的类,都默认继承object类,object是所有Python类的基类,即在Python3当中所有的类均为新式类。

 

问题8:在Python当中,多继承的继承顺序问题

Java当中的类只能支持单继承,不能支持多继承,而Python当中的类支持多继承,如A(B,C,D)

如果继承关系为非菱形结构,属性的查找顺序为深度优先(先忽略)

如果继承关系为菱形结构,属性的查找方式有两种,分别是:深度优先和广度优先:当类是经典类时,在多继承情况下,属性的查找顺序为深度优先,当类是新式类时,在多继承情况下,属性的查找顺序为广度优先

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。

 

问题9:简述为什么在项目当中继承要慎重

B类继承了A类,则B类会遗传A类的所有属性,包括数据属性和函数属性,也就是说,在继承当中,父类的私有成员在物理上已经被子类继承了过来,只不过在逻辑上程序员无法去访问它,因此继承必须要慎重,否则会浪费内存空间。

 

问题10在面向对象当中,对于对象而言,简述属性的查找顺序

对象层:先从对象自己的名称空间当中去寻找,然后在从自己的类的名称空间去寻找,在从父类的名称空间当中去寻找....直到最顶层父类的名称空间去寻找。

类对象不会到元类当中进行属性查找。

 

问题10+:在面向对象当中,对于类而言,简述属性的查找顺序

    属性的查找分成两层,一层是对象层,一层是元类层,查找顺序先是对象层,然后再是元类层。

对象层:先从类对象自己的名称空间当中去寻找,在从父类的名称空间当中去寻找....直到最顶层父类的名称空间去寻找。

 

问题11:在面向对象当中,简述方法重写的两个注意事项

如果子类对继承自父类的方法不满意,则可以重写父类的方法,

需要注意的是,一旦重写了继承自父类的方法,那么在调用该方法时,就以自己的为准了,但是继承自父类的方法并没有真正的被覆盖掉,在子类当中仍然可以进行调用。

 

问题12:在面向对象当中,简述类与类之间的三种关系

(1)一般到特殊的关系,即抽象到具体的关系,如继承

(2)包含关系,如汽车与汽车轮子,如派生

(3)使用关系,如汽车司机与汽车

 

问题13:在面向对象当中,简述继承与组合之间的区别

继承反映的是现实世界中一般到特殊的关系,即抽象到具体的关系,通过继承建立了派生类与基类之间的关系,它是一种是的关系,如白马是马,人是动物。

组合指的是,在一个类中以另外一个类的对象作为数据属性,一个类的属性可以是一个类对象,称为类的组合。用组合的方式建立了类与组合的类之间的关系,它是一种有的关系,比如教授有生日,汽车有汽车轮子。

 

问题14:在面向对象当中,简述继承与组合的使用场景

组合与继承都是有效地利用已有类的资源的重要方式,但是两者的使用场景皆不同。

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好。

 

问题15:在面向对象当中,简述super关键字的用法

通过super关键字可以在子类当中调用父类对应的方法(包括构造方法),等价于父类名.父类方法()

 

问题16:在面向对象当中,简述什么时候使用继承.

(1)面向对象编程的优点是代码的复用,而继承是实现代码复用的方法之一

(2)如果需要定义几个类,而这几个类与类之间有一些公共的属性和方法,这时就可以把相同的属性和方法作为基类的成员,而特殊的方法及属性则在本类当中定义,这时只需要继承基类这个动作,就可以访问到基类的属性和方法了,它提高了代码的可扩展性

 

问题17:在面向对象当中,简述子类调用父类方法的两种方式

1Parent.parentMethod(self)

2self.parentMethod()

3super.parentMethod()

第一种是直接用父类的类名.方法名去调用父类的方法,但是需要注意的是,这种调用方法必须将self作为参数传进去并且作为第一个参数,表示指向这个类的实例本身。这种方法多用于方法重写时。

第二种是直接用self去调用父类的方法,因为一旦子类继承了父类,那么子类就拥有父类所有的公有方法和属性,所以此时父类的方法和属性就相当于子类自己了,所以可以直接用self去直接调用实例的方法,而不用再传入self参数了。

第三种我是推荐的.

 

问题18:在面向对象当中,简述子类如何继承父类的构造函数

继承类的构造方法:

1.经典类的写法: 父类名称.__init__(self,参数1,参数2...)

2. 新式类的写法:super(子类,self).__init__(参数1,参数2....)

3super().__init__(参数1,参数2....)

 

问题19:在面向对象当中,简述类和对象的概念

(1)对象是特征(变量)与技能(函数)的结合,类是一系列对象共有的特征与技能的结合体

(2)把一类事物的静态属性和动态可以执行的操作组合在一起所得到的这个概念就是类 

(3)类的一个个体就是对象,对象是具体的、实实在在的事物

(4)创建类的目的就是通过类这个事物将一类事物的静态属性和相关的方法封装起来,构成一个统一的整体.

 

问题20:在Python当中,简述类成员和对象成员的具体概念

Python当中,类有两种属性:数据属性(类属性)和函数属性

数据属性:定义在类内部的变量称为类的数据属性,是所有对象共享的,由操作系统只分配一块内存空间,大家共同使用这一块内存空间,

对同一个变量进行操作。

函数属性:定义在类内部的函数称为类的函数属性,在默认情况下是绑定给对象使用的,即obj.func() 会把obj本身当做第一个参数传入。

注意:对于类的数据属性来说,如果类的数据属性是不可变类型,那么类对象对其只有访问权限,如果类的数据属性是可变类型,那么类对象对其将有修改权限(不同于Java)。

Python当中,对象有两种属性:实例属性(静态属性)和实例方法(动态属性)。

 

问题21:在Python当中,简述类属性和实例属性的区别

Python当中,类属性是所有对象共享的,由操作系统只分配一块内存空间,大家共同使用这一块内存空间,对同一个变量进行操作。

对于类的数据属性来说,如果类的数据属性是不可变类型,那么类对象对其只有访问权限,如果类的数据属性是可变类型,那么类对象对其将有修改权限(不同于Java)。

Python当中,实例属性仅属于某一个对象的。

 

 

问题22:在Python当中,简述封装的实现机制以及相应的缺陷

Python当中,通过双下划线__开头的方式可以将属性隐藏起来,将属性设置成私有的,以此来提高程序的安全性,在类中定义的所有双下划线开头的名称如__X都会在类定义时自动变形成为:_类名__X的形式。

但是在Python当中并没有真正意义上的隐藏,只能从语法级别来实现一些事情,做一些变形的操作,因为在类的外部通过___属性的方式是可以间接访问到类内部的私有成员的 ,Python的这种保护机制主要用来限制在类的外部对私有成员的直接访问。

 

问题23:在Python当中,简述封装的注意事项

第一:__开头的这种语法,只在类定义的阶段发生形变,而且只会在类定义的阶段发生形变,类定义阶段结束之后,在给类或者实例对象增加一个__属性,并不会形变。

第二:父类的私有成员无法被子类继承,即子类不能访问父类的私有成员,但是通过转换语法可以。

第三:封装的属性可以直接在类的内部进行使用,而不能在类的外部被直接使用,即类中定义的__x可以在类的内部被直接使用,如self.__x,引用的就是变形的结果,但是在类的外部是无法通过__x这个名字直接访问到的。

 

问题24:在Python当中,简述什么是property

通过property可以将一个类的函数定义成类的数据属性,可以像访问数据属性一样去访问类的函数,进而触发函数的执行,得到相应的运行结果。

 

问题24:在Python当中,简述内置函数__call__的用法

一个可调用的对象加括号,就是触发这个对象所在的类中的__call__方法的执行,一个对象可以加括号意味着产生这个对象对应的类里面肯定含有__call__方法,反之要想让某个对象变成一个可调用的对象,需要在该对象的类中定义一个方法__call__方法。

一个可调用的对象加上()的返回值就是这个对象所在类中的__call__方法的返回值.

当一个类实现__call__方法时,这个类的实例就会变成可调用对象。

 

问题25:在Python当中,简述元类的概念

Python当中万物皆对象,我们用class关键字定义的类本身也是一个对象,负责产生该对象的类称之为元类,元类可以简称为类的类,在元类当中,__new____init__的主要目的是为了控制类的创建行为,__call__的主要目的是为了控制类的实例化行为.

需要说明的是:在元类当中,控制类的创建行为主要由__new__完成,既完成了类的创建,也完成了类的实例化.

 

typePython的一个内建元类,用来直接控制生成类,在python当中任何class定义的类其实都是type类实例化的结果。

只有继承了type类才能称之为一个元类,否则就是一个普通的自定义类,自定义元类可以控制类的产生过程,类的产生过程其实就是元类的调用过程.

 

问题26:在Python当中,创建类的两种方式

一个类由三大组成部分,分别是

1、类名class_name

2、继承关系class_bases

3、类的名称空间class_dict

方式1:使用class关键字

方式2:通过type关键字,依次传入以上三个参数即可。

 

问题27:在Python当中,简述__call__,__new__,__init__三者之间的关系

在类实例化的过程当中,哪个对象加()就寻找产生这个对象的类的__call__方法,只要是__call__方法,一定会做三件事情:

第一:调用__new__方法,构造新的对象,相当于Java当中的构造函数.(对象自己的__new__

第二:调用__init__方法,去初始化这个对象(对象自己的__init__

第三:返回这个对象.

注意:__new__更像是其他语言当中的构造函数,必须有返回值,返回值实例化的对象,__init__只是初始化构造函数,必须没有返回值,仅仅只是初始化功能,并不能new创建对象.

 

 

问题28:在Python当中,简述Objecttype之间的关系

object type的关系很像鸡和蛋的关系,先有object还是先有type没法说,obejcttype是共生的关系,必须同时出现的。

在面向对象体系里面,存在两种关系:
父子关系,即继承关系,在python里要查看一个类型的父类,使用它的__bases__属性可以查看。
类型实例关系,表现为某个类型的实例化,在python里要查看一个实例的类型,使用它的__class__属性可以查看,或者使用type()函数查看。

Python的世界中,object是父子关系的顶端,所有的数据类型的父类都是它,type是类型实例关系的顶端,所有对象都是它的实例的,它们两个的关系可以这样描述:Objecttype的一个实例。

 

问题28:在Python当中,简述__new__,__init__者之间的关系

__new__用于创建类的实例,__init__用于初始化这个实例。

__new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法。

 

问题29:简述什么是单例模式,并用Python设计出单例模式.

单例:即单个实例,指的是同一个类实例化多次的结果指向同一个对象,用于节省内存空间.

 

问题30通过 python__call__ 函数与元类type实现单例模式.

 

问题31python中如何实现抽象类.

利用abc模块即可.

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/zhangmingyang/p/9446706.html