1. 什么是类和实例并说明他们之间的关系
类对象是将具有相似属性和方法的对象总结抽象为类对象,可以定义相似的一些属性和方法,不同的实例对象去引用类对象的属性和方法,能减少代码的重复率。 实例对象又称实例化对象,不是抽象而是一类对象中具体的一例对象。 类是由一些语句组成,但是实例,是通过调用类生成,每次调用一个类,就得到这个类的新的实例。 主要的区别: 定义类方法主要是要加一个装饰器,@classmethod而实例方法没有这个装饰器。这是区别实例方法和类方法的最主要的区别。 在调用上的区别在于,实例方法要先实例化一个对象再调用这个实例化方法,而类方法不需要有类的实例,直接类名.方法名就可以调用。
实例方法至少有一个参数,通常用self,这个参数里面是这个实例本身。类方法至少有一个参数,通常用cls,这个参数里面是这个类本身。 实例方法由于有实例,所以实例的属性对其实可见的,但类方法显然没有属性。
2. 类的实例方法、类方法和静态分别如何定义举例说明,并总结它们的应用场景
python 类语法中有三种方法,实例方法,静态方法,类方法。 实例方法: 普通实例方法,第一个参数需要是self,它表示一个具体的实例本身。 实例方法或者叫对象方法,指的是我们在类中定义的普通方法。 只有实例化对象之后才可以使用的方法,该方法的第一个形参接收的一定是对象本身。 静态方法: 如果用了装饰器@staticmethod,那么就可以无视这个self,而将这个方法当成一个普通的函数使用。 (1).格式:在方法上面添加 @staticmethod (2).参数:静态方法可以有参数也可以无参数 (3).应用场景:一般用于和类对象以及实例对象无关的代码。 (4).使用方式: 类名.类方法名(或者对象名.类方法名)。 类方法: 而对于装饰器@classmethod,它的第一个参数不是self,是cls,它表示这个类本身。 (1).在方法上面添加@classmethod (2).方法的参数为 cls 也可以是其他名称,但是一般默认为cls (3).cls 指向 类对象 (5).应用场景:当一个方法中只涉及到静态属性的时候可以使用类方法(类方法用来修改类属性)。 (5).使用 可以是 对象名.类方法名。或者是 类名.类方法名
运行结果:
调用:
(1) 实例方法==>一般只能被实例对象调用;类对象调用实例方法时,需要传个实例对象 (2 )静态方法、类方法==>可以被类对象或实例对象调用。
外形:
(1 )实例方法=>第一个参数-实例对象(PEP8规范-self) (2 )静态方法==>@staticmethod装饰,无隐含参数,引用类成员必须通过类对象来引用 (3 )类方法==>@classmethod装饰,第一个参数-类对象(PEP8规范-cls)
场景:
(1) 实例方法==>为实例对象单独拥有时 (2 )类方法==>为所有实例对象共有时;需要继承,也可以定义为类方法。 (3 )静态方法==>在类的命名空间,不涉及类成员、实例成员的操作时,始终使用同一块内存,节省空间
3. MRO是什么,描述其查找顺序
MRO即Method Resolution Order(方法解析顺序),即在调用方法时,会对当前类以及所有的基类进行一个搜索,以确定该方法之所在,而这个搜索的顺序就是MRO。 一个类的 MRO 列表就是合并所有父类的 MRO 列表,并遵循以下三条原则: 子类永远在父类前面 如果有多个父类,会根据它们在列表中的顺序被检查 如果对下一个类存在两个合法的选择,选择第一个父类
首先寻找整个图中入度为0的,也就是A,那么A也就成为MRO中的第一个。
然后我们去掉图中的A节点以及与A相关的连线,再寻找入度为0的点,这时有B和C两个节点,我们选择最左边的点即B。选完左边的B点后,再选右边的C点,这样B和C也就跟着进入了MRO序列,现在MRO序列为{A,B,C}。(注意每次层次遍历一定要把那一层选完才能选下一层,不能在没有选C之前跳到选E)
然后去掉B和C以及与它们相关的连线,这时候入度为0的也就是D、E、F了,依次选择,使D、E、F进入MRO序列。
最后也就使得object进入MRO序列。
以上的MRO序列也就是{ABCDEFobject}
4. Mixin是什么,描述其应用场景
Mixin本质上是多继承实现的。 Mixin体现的是一种组合的设计模式。
mixin类扮演父类的角色,包含其他类想要的功能。 然后,一个子类可以继承或简单地重用此功能,但不能作为专业化的手段。通常,mixin将会将所需的功能导出到子类中,而不会创建一个单一的“is a”关系。 这是mixins和继承的概念之间的重要区别,因为子类仍然可以继承父类的所有功能,但是,不必一定应用关于子对象“作为一种”父语义的语义。
Mixin优点 (1)通过允许多个类使用通用功能,但没有多重继承的复杂语义,为多重继承提供了一种机制. (2)代码可重用性:当程序员希望在不同类之间共享功能时,Mixins很有用。 而不是一遍又一遍地重复相同的代码,通用功能可以简单地分组成一个混合,然后继承到需要它的每个类中。 (3)Mixins允许继承和使用只有父类的所需功能,不一定是父类的所有功能.
但 Mixin 终归不属于语言的语法,为了代码的可读性和可维护性,定义和使用 Mixin 类应该遵循几个原则: (1)Mixin类种不应该显示的出现_int_初始化方法 (2)Mixin 实现的功能需要是通用的,并且是单一的,比如上例中两个 Mixin 类都适用于大部分子类,每个 Mixin 只实现一种功能,可按需继承。 (3)Mixin 只用于拓展子类的功能,不能影响子类的主要功能,子类也不能依赖 Mixin。比如上例中 Person 继承不同的 Mixin 只是增加了一些功能,并不影响自身的主要功能。如果是依赖关系,则是真正的基类,不应该用 Mixin 命名。 (4)Mixin 类自身不能进行实例化,仅用于被子类继承。
Mixin在python中的应用 在Python中,SocketServer模块]具有UDPServer类和TCPServer类。它们分别作为UDP和TCP套接字服务器的服务器。 另外,还有两个mixin类:ForkingMixIn和ThreadingMixIn。通常,所有新连接都在相同的过程中处理。 通过使用ThreadingMixIn扩展TCPServer。 ThreadingMixIn类向TCP服务器添加功能,以便每个新连接创建一个新的线程。或者,使用ForkingMixIn将导致为每个新连接分叉进程。 显然,创建新线程或分支进程的功能作为独立类不是非常有用的。 mixins提供了替代底层功能,而不影响套接字服务器的功能。 示例:class ThreadingTCPServer(ThreadingMixIn, TCPServer):
|