Python Day25

1、复习:

子类的对象要去调用方法或者属性:自己有的调自己的,自己没有的调父类的
self是什么:谁调用就是谁
子类的对象调用父类的方法,在父类方法中的self是子类的对象
class Foo:
def get_test(self):
self.test()
def test(self):
pass

class Son(Foo):
def test(self):
pass
f = Son()
f.get_test()

super:如果自己有还要用子类对象调父类的
# super(子类名,子类对象).父类方法名
class Foo:
def get_test(self):
self.test()
def test(self):
pass

class Son(Foo):
def test(self):
super().test() #调用父类的test
super(Son,self).test() #调用父类的test

s = Son()
f = Foo()
f.test(s)
# s = Son()
# s.test()
# 在类外
# super(Son,s).test()
# 在类内
# super(Son,self).test()
# super().test()

一 抽象类和接口类

 1 什么是抽象类:可以实现具体的某个功能,并且不支持多继承的这个父类就叫做抽象类。

 2 什么是接口类:不实现具体的方法的并且推荐多继承的这个父类就叫做接口类。

  抽象类和接口类都是为了定义子类的规范。

 3 什么叫做归一化设计:创建一个函数来调用类里面的属性或方法,不需要(对象.方法())来调用,这种设计思想就叫做归一化设计。前提条件是几个类都实现相同的方法。

 4 abc模块:用于接口类和抽象类中一个模块。ABC是Abstract Base Class的缩写。

  abc.ABCMeta:由于生成抽象类和接口类的抽象方法和抽象属性,由他生成的类可以直接被继承。

  abc.abstractmethod:给父类的方法加上一个装饰器。

接口类:

import abc
class Payment(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def payment(self哦,monry):pass
class Wei(Payment):
    def payment(self,monry):
        print(‘微信支付%s元‘%monry)
class Zhi(Payment):
    def fuqian(self,monry):
        print(‘支付宝支付%s元‘%monry)
def payment(suixiang,monry):
    suixiang.payment(monry)
d1=Wei()
payment(d1,100)

d2=Zhi()       #报错
payment(d2,200)   #报错

 如果在子类中没有和接口类相同的方法,只要创建该子类对象就会报错。

 抽象类:

import abc
class Payment(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def payment(self,money):
        print(‘支付了%s元‘%(money))
class Wei(Payment):
    def payment(self,monry):
        super().payment(monry)
class Zhi(Payment):
    def pay_ment(self,money):
        pass
def payment(self,money):
    self.payment(money)
w1=Wei()
payment(w1,100)

z1=Zhi()
payment(z1,200)

5 多继承一般情况下不用,但是可以在接口类的情况下使用

from abc import ABCMeta,abstractmethod
class Fly_animal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):pass
class Walk_animal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):pass
class Swim_animal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):pass
class Tiger(Walk_animal,Swim_animal):
    def walk(self):print(‘%s is walking‘%self)
    def swim(self):print(‘%s is swiming‘%self)
class Frog(Walk_animal,Swim_animal):
    def walk(self):print(‘%s is walking‘%self)
    def swim(self):print(‘%s is swiming‘%self)
class Swan(Fly_animal,Walk_animal,Swim_animal):
    def walk(self):print(‘%s is walking‘%self)
    def swim(self):print(‘%s is swiming‘%self)
    def fly(self):print(‘%s is flying‘%self)
t1=Tiger()
t1.walk()
f1=Frog()
f1.swim()
s1=Swan()
s1.fly()

6 依赖倒置原则:高层的模块应该不依赖于底层模块;二周都应该依赖于抽象;抽象不应该依赖于细节;细节应该依赖于抽象;换言之:要针对接口编程,而不是针对实现编程。

 7 接口隔离原则:使用多个专门的接口,而不是使用单一的总接口,即客户端应该不依赖于那些不需要的接口

二 新式类和经典类

 1 python中分为新式类和经典类

  在python2 中定义经典类:class  父类名:

  在python2中定义新式类:class   父类名(object):

  object是所有类的基类。

  新式类和经典类在继承的顺序上的不同:在新式类中属于官渡优先;在经典类中属于深度优先。

  什么叫深度优先

  在经典类中,从左到右每个分支查找到底,在进行下一个分支的查找,如果有共同的父类,在查找的第一个分支,就会查找到这个共同的父类,然后在进行下一个分支的查找,在后面查找是不会在去查找他们共同的父类。

  什么叫广度优先:

在新式类中,从左到右每个分支查找完毕到他们的共同父类下的子类后,在去查找下一条分支,直到共同父类下的分组查找完毕过后,最后在查找他们共同的父类。

在心=新式类中,mro()可以查看寻找的顺序,经典类中不能使用

class A:
    def func(self):
        print(‘A‘)
class B(A):
    def func(self):
        print(‘B‘)
class C(B):
    def func(self):
        print(‘C‘)
class D(A):
    def func(self):
        print(‘D‘)
class E(D):
    def func(self):
        print(‘E‘)
class F(A):
    def func(self):
        print(‘F‘)
class G(F):
    def func(self):
        print(‘G‘)
class H(C,E,G):
    def func(self):
        print(‘H‘)
h=H()
h.func()
print(H.mro())

调用经典类:父类名(子类名,对象).功能或者方法。调用是需要传入两个参数,一个是子类名,一个是对象

  调用新式类:父类名().功能或者方法。父类可以不需要传入参数。

 在python3 中只有新式类,而没有经典类。

三 多态

 什么是多态:一种事物的多种形态叫做多态,这里指的是一个参数的多种形态

 python是自带多态的

 什么是多态性:在python中一个参数可以使用多种数据类型,就叫做多态性

 鸭子类型:在各种数据类型之间他们没有任何的联系,但是他们拥有着一些共同的属性或者功能,这就叫做鸭子类型。

 

时间: 2024-10-12 17:36:12

Python Day25的相关文章

python面向对象之 封装(Day25)

封装: 隐藏对象的属性和实现细节,仅对外提供公共访问方式 好处:1.将变化隔离 2.便于使用 3.提高复用性 4.提高安全性 封装原则: 1.将不需要对外提供的内容隐藏起来 2.把属性都隐藏,提供公共方法对其访问 二.私有变量和私有方法 在Python中用双下划线开头的方式将属性隐藏起来(设置成私有的) 2.1 私有变量 #其实这仅仅这是一种变形操作 #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式: class A: __N=0 #类的数据属性就应该是共享的,但是语法上是

python 全栈 python基础 (十三)匿名函数 与 内置函数

一.匿名函数  1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号前是参数,可以有多个,用逗号隔开:冒号右边的为表达式,需要注意的是只能有一个表达式.由于lambda返回的是函数对象(构建的是一个函数对象),所以需要定义一个变量去接收.  3.注意点:lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值.lambda 函数不能包含命令,包含

python 作业

Linux day01 计算机硬件知识整理 作业要求:整理博客,内容如下 编程语言的作用及与操作系统和硬件的关系 应用程序->操作系统->硬件 cpu->内存->磁盘 cpu与寄存器,内核态与用户态及如何切换 存储器系列,L1缓存,L2缓存,内存(RAM),EEPROM和闪存,CMOS与BIOS电池 磁盘结构,平均寻道时间,平均延迟时间,虚拟内存与MMU 磁带 设备驱动与控制器 总线与南桥和北桥 操作系统的启动流程 应用程序的启动流程 day02 作业要求一:整理操作系统博客 为何

Python基础之内置函数

一.内置函数表(Python 3.x) 1.数学运算类: 2.集合类操作: 3.逻辑判断: 4.反射: 5.IO操作: 二.内置函数使用实例: 1.abs() 取绝对值 print(abs(3)) print(abs(-3)) #取-3的绝对值 --------输出结果-------- 3 3 2.all() 括号里的内容都为True时,结果才为True,反之为False print(all("")) #可迭代对象是空的,也返回True print(all((1,2,"a&q

python匿名函数 与 内置函数

一.匿名函数  1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号前是参数,可以有多个,用逗号隔开:冒号右边的为表达式,需要注意的是只能有一个表达式.由于lambda返回的是函数对象(构建的是一个函数对象),所以需要定义一个变量去接收.  3.注意点:lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值.lambda 函数不能包含命令,包含

python的类的 静态属性 类方法 静态方法

一.静态属性 静态属性说的就是数据属性 1.定义一个房间的类,求下这个房间的面积 class Room: def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执

Python学习1-Python和Pycharm的下载与安装

本文主要介绍Python的下载安装和Python编辑器Pycharm的下载与安装. 一.Python的下载与安装 1.下载 到Python官网上下载Python的安装文件,进入网站后显示如下图: 网速访问慢的话可直接在这里下载:python-2.7.11.amd64 在Downloads中有对应的支持的平台,这里我们是在Windows平台下运行,所以点击Windows,出现如下: 在这里显示了Python更新的所有版本,其中最上面两行分别是Python2.X和Python3.X对应的最后更新版本

Python——深入理解urllib、urllib2及requests(requests不建议使用?)

深入理解urllib.urllib2及requests            python Python 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循 GPL(GNU General Public License)协议[1] .Python语法简洁而清晰,具有丰富和强大的类库. urllib and urllib2 区别 urllib和urllib2模块都做与请求URL相关的操作,但

python学习_day26_面向对象之封装

1.私有属性 (1)动态属性 在python中用双下划线开头的方式将属性隐藏起来.类中所有双下划线开头的名称,如__x都会自动变形成:_类名__x的形式.这种自动变形的特点是: a.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果.b.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的.c.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆