马哥门徒DEVOPS第九周

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):

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值