python学习笔记-09

面向对象编程-中

面向对象三大特征:封装、继承、多态。

封装:把内容封装起来便于后面的使用。对于封装来讲,就是使用__init__方法将内容封装道对象中,然后通过对象直接或者self获取被封装的内容。

继承:子继承父的属性和方法。

多态:所谓多态就是定义时的类型和运行时的类型不一样,同一种行为对于不同的子类对象有不同的行为表现。python不支持Java和C#这一类强类型语言中多态的写法,但是原生多态,“鸭子类型”。

鸭子类型:在程序设计中,鸭子类型是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。
鸭子测试:当看到一只鸟走起来像鸭子、游泳像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。
在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。

1.析构函数

析构方法:当一个对象被删除或者被销毁时,python解释器也会默认调用一个方法,这个方法为__del__()方法,也成为析构方法。

一般来讲程序执行结束自动调用此方法。

#析构方法
class Animal:
    def __init__(self,name):
        self.name=name
        print('init方法调用,初始化%s对象'%(self.name))
        pass
    def __del__(self):
        print('del方法调用,释放%s内存空间'%(self.name))
        pass
    pass
cat=Animal('猫')
print('=================')
dog=Animal('柯基')
#由此可看,是当函数彻底执行结束后才释放所有内存空间

在这里插入图片描述
除此之外,对象被删除的时候也会调用析构方法。

#析构方法
class Animal:
    def __init__(self,name):
        self.name=name
        print('init方法调用,初始化%s对象'%(self.name))
        pass
    def __del__(self):
        print('del方法调用,释放%s内存空间'%(self.name))
        pass
    pass
cat=Animal('猫')
del cat   #手动删除对象,执行__del__方法
print('=================')
dog=Animal('柯基')

在这里插入图片描述
析构方法主要是用于释放空间,释放后对象就不能再使用。

总结:
当整个程序脚本执行完毕后会自动调用__del__方法
当对象被手动销毁时也会自动调用__del__方法
析构函数一般用于资源回收,利用__del__方法销毁对象回收内存等资源

2.继承

2.1 单继承

#单继承
#父类:
class Animal:
    def eat(self):
        '''
        父类方法
        :return:
        '''
        print('吃')
        pass
    def drink(self):
        '''
        父类方法
        :return:
        '''
        print('喝')
        pass
    pass
#子类
class Dog(Animal):   #继承Animal
    def wwj(self):
        '''
        子类独有的方法
        :return:
        '''
        print('小狗汪汪叫')
    pass
class Cat(Animal):
    def mmj(self):
        '''
        子类独有的方法
        :return:
        '''
        print('小猫喵喵叫')
        pass
    pass
d1=Dog()
d1.eat()
c1=Cat()
c1.drink()

在这里插入图片描述

对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法,极大提高效率,精简代码,便于扩展。

单继承的语法:
class 子类名(父类名):
		.......

2.2 多继承
子类可以继承多个父类,同时拥有多个父类的公共方法。

#多继承
#父类1
class God:
    def fly(self):
        print('神都会飞')
        pass
    pass
#父类2
class Monkey:
    def eat(self):
        print('猴子都吃桃子')
        pass
    pass
#子类
class Swk(God,Monkey):   #多继承
    def chan(self):
        print('孙悟空会七十二变')
        pass
    pass
s=Swk()
s.chan()
s.fly()
s.eat()

在这里插入图片描述
当多个父类中存在相同的方法时,一层层向上找,就近原则使用。

class D(object):
    def eat(self):
        print('D.eat')
        pass
    pass
class C(D):
    def eat(self):
        print('C.eat')
        pass
    pass
class B(D):
    pass
class A(B,C):
    pass
a=A()
a.eat()
print(A.__mro__)  #可以显示类的依次继承关系

在这里插入图片描述
2.3 继承的传递
孙-子-父

class Grandfather:
    def eat(self):
        print('爷爷的吃')
        pass
    pass
class Father(Grandfather):
    pass
class Son(Father):
    pass
s=Son()
print(Son.__mro__)
s.eat()  #此方法是从父类的父类继承过来的
#在类的传递过程中,我们把父类称为基类,子类称为派生类,父类的属性喝方法可以一级一级的传到子类,多少级都可以

在这里插入图片描述

3.重写父类方法

所谓重写就是在子类中有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法,实际上也就是上述的“就近原则”,这种重写的方法中父类子类的变量什么的都是不互通的。

但如果一味的重写会使父类继承失去意义,因此如果在子类中重写时可以调用父类方法,提高代码效率。

4.调用父类方法

class Dog:
    def __init__(self,name,color):
        self.name=name
        self.color=color
        pass
    def bark(self):
        print('叫')
        pass
    pass
class keji(Dog):
    def __init__(self,name,color):
        Dog.__init__(self,name,color)   #法一:手动调用调用父类的方法,执行完毕就可以具备name,color这两个实例属性了
        super().__init__(name,color)     #法二:也可以这样调用super是自动找到父类进而调用方法,如果有多个父类会逐一的找直到找到为止
        self.height=20  #如果想要除了父类中的属性之外的属性可以声明
        pass
    def bark(self):
        super().bark()
        print('柯基叫')
        print(self.name)
        pass
    def __str__(self):
        return '{}的颜色是{},它的身高是{}'.format(self.name,self.color,self.height)
    pass
kj=keji('柯基','黄')
kj.bark()
print(kj )

在这里插入图片描述

注:
super()自动调用和手动调用写一个就行

5.多态

要想实现多态必须遵守两个前提:
1.继承:多态必须发生在父类和子类之间
2.重写:子类必须要重写父类的方法
#多态
class Animal:
    def speak(self):
        print('我是')
    pass
class Duck(Animal):
    pass
duck=Duck()
duck.speak()
#多态
class Animal:
    def speak(self):
        print('我是')
    pass
class Duck(Animal):
    def speak(self):
        print('我是一个鸭子')
    pass
duck=Duck()
duck.speak()

在这里插入图片描述
在这里插入图片描述
以上就是一种多态的体现,同样是duck.speak,输出两个不一样的结果。
法一:

#多态
class Animal:
    def speak(self):
        print('我是')
    pass
class Duck(Animal):
    def speak(self):
        print('我是一个鸭子')
    pass
duck=Duck()
duck.speak()
class Dog(Animal):
    def speak(self):
        print('我是一只小狗')
        pass
    pass
dog=Dog()
dog.speak()

法二:

#多态
class Animal:
    def speak(self):
        print('我是')
    pass
class Duck(Animal):
    def speak(self):
        print('我是一个鸭子')
    pass
class Dog(Animal):
    def speak(self):
        print('我是一只小狗')
        pass
    pass
def commonInvoke(obj):
    '''
    统一调用的方法
    :param obj:对象的实例
    :return:
    '''
    obj.speak()
    pass
listObj=[Duck(),Dog()]
for i in listObj:
    '''
    循环调用函数
    '''
    commonInvoke(i)

#用一个函数调用

在这里插入图片描述
以上是多态的第二种体现

多态的优点:
增加程序的灵活性
增加程序的扩展性

6.类属性和实例属性

类属性是类对象所拥有的属性,它被所有类对象的实例对象共有,类对象和实例对象可以访问。

实例属性是实例对象所拥有的属性,只能通过实例对象访问

#类属性
class Student:
    name='黎明'   #类属性
    def __init__(self,age):
        self.age=age   #实例属性
        pass
    pass

lm=Student(18)
print(lm.name)    #通过实例对象访问类属性
print(lm.age)
print('------------')
print(Student.name)    #通过类对象访问name
print(Student.age)     #报错是因为age归实例对象所有,不属于类对象
#只有类属性可以被类对象和实例对象共同访问
#实例属性只能由实例对象访问

在这里插入图片描述
所有的实例对象访问的类属性是一个值,实例属性不同。
实例对象对于类属性只有使用的权力,没有修改的权力。

#类属性
class Student:
    name='黎明'   #类属性
    def __init__(self,age):
        self.age=age   #实例属性
        pass
    pass

lm=Student(18)
print(lm.name)    #通过实例对象访问类属性
lm.name='修改'     #重新声明一个值
print(lm.age)
print(lm.name)    #重新声明后改变了自己
print('------------')
xh=Student(22)
print(xh.name)    #重新声明完后并没有改变
print('----------------')
print(Student.name)    #通过类对象访问name

在这里插入图片描述

#类属性
class Student:
    name='黎明'   #类属性
    def __init__(self,age):
        self.age=age   #实例属性
        pass
    pass
Student.name='change'   #这样可以彻底改变类属性的值
lm=Student(18)
print(lm.name)    #通过实例对象访问类属性   
print(lm.age)
print(lm.name)    #重新声明后改变了自己
print('------------')
xh=Student(22)
print(xh.name)    #重新声明完后并没有改变
print('----------------')
print(Student.name)    #通过类对象访问name

在这里插入图片描述

7. 类方法和静态方法

7.1 类方法
类方法:类对象所拥有的方法,需要用装饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数,类方法可以通过类对象、实例对象调用。

#类方法
class People:
    country='china'
    @classmethod
    def get_country(cls):
        return cls.country  #访问类属性
        pass
    @classmethod
    def change_country(cls,data):
        cls.country=data   #在类方法中修改类属性的值
        pass
    pass
print(People.get_country()) #通过类对象去引用
p=People()
print(p.get_country())
p.change_country('england')
print(p.get_country())

在这里插入图片描述
7.2 静态方法
类对象所拥有的方法,需要用@staticmethod标识静态方法,静态方法不需要任何参数。

#类方法
class People:
    country='china'
    @classmethod
    def get_country(cls):
        return cls.country  #访问类属性
        pass
    @classmethod
    def change_country(cls,data):
        cls.country=data   #在类方法中修改类属性的值
        pass
    @staticmethod
    def getData():
        return People.country
        pass
    pass
print(People.getData())
p=People()
print(p.getData())  #一般情况下,我们不会通过实例对象访问静态方法
#静态方法的逻辑实现和类、实例对象没什么交互,主要用来存放逻辑性代码,一般不会涉及到类中方法和属性的操作。数据资源能够得到充分利用
# 返回当前的系统时间:
import time
class Time:
    @staticmethod
    def showTime():
        return time.strftime('%H:%M:%S',time.localtime())
    pass
print(Time.showTime())

7.3 区别

1.类方法的第一个参数是类对象cls,通过cls引用的类对象的属性和方法,用装饰器@classmethod修饰
2.实例方法的第一个参数是实例对象self,通过self引用的可能是类属性,也有可能是实例属性,具体问题具体分析,不过存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
3.静态方法中不需要额外定义参数,因此在静态方法中引用类属性的化必须通过类对象引用,必须用@staticmethod修饰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/727845.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

node + selenium-webdriver 进行Web自动化测试

1、环境安装 nodejs安装 webdriver安装,安装各浏览器的驱动,通过各浏览器的驱动程序,操作浏览器。 chrome 驱动安装 每个版本的浏览器用到的webdriver不同。可以通过chrome右上角-> 帮助 -> 关于 Chrome 查看当前版本。 chromedriver下载地址和chromedriver与chrome之…

单木:面试官超爱问的字符串,今天给它彻底讲透

本文已收录于:https://github.com/danmuking/all-in-one(持续更新) 前言 哈喽,大家好,我是 DanMu。今天这边文章,想和大家聊聊有关字符串的问题,字符串似乎很简单,但其实字符串几乎…

【多模态论文】CLIP(Contrastive Language-Image Pre-training)

论文:Learning Transferable Visual Models From Natural Language Supervision 链接:https://arxiv.org/abs/2103.00020 摘要 问题: 对预定的类别进行预测,这种有监督的训练形式受限于额外标记数据 。如何利用图像的原始文本来获…

为什么3D渲染让客户无法抗拒?7个重要原因

客户通常对工程、建筑、复杂的室内外设计知之甚少,展示草图只会让他们感到难以理解。不过,现代设计师和建筑师不再需要为此烦恼。 通过使用逼真且沉浸式的3D渲染,他们可以让能够轻松地向客户传达信息和沟通想法。它对赢得客户至关重要。接下…

Java多线程设计模式之保护性暂挂模式

模式简介 多线程编程中,为了提高并发性,往往将一个任务分解为不同的部分。将其交由不同的线程来执行。这些线程间相互协作时,仍然可能会出现一个线程等待另一个线程完成一定的操作,其自身才能继续运行的情形。 保护性暂挂模式&a…

NodeJs 连接本地 mySql 数据库获取数据

写在前面 今天把 nodejs 连接本地数据库的坑简单的踩一下,为后续写接口做个铺垫 安装 mySql (mac举例子) 安装地址 安装完成大概这个样子,起动起来就行 安装本地数据库连接工具(navicat举例子) 安装地…

文件防篡改监控工具 - WGCLOUD全面介绍

WGCLOUD是一款优秀的运维监控软件,免费、轻量、高效,部署容易,上手简单,对新手非常友好 WGCLOUD部署完成后,点击菜单【文件防篡改】,可以看到如下页面 我们点击【添加】按钮,输入监控文件的信息…

赛力斯:“新王”能做多久

最近,电车圈又有大事了。 造车新势力们迎来“新王”——赛力斯。 最近,赛力斯市值突破1500亿,反超理想, 成为新势力市值一哥。 今年第一季度,赛力斯新能源汽车销量达94825辆,同比增长高达374.77%&#xf…

想要高效回复客户消息?来看看这个款微信神器

不管是销售还是客服来说,能及时回复客户的反馈和问题,是确保顾客满意度的关键因素。 今天,就给大家分享一个职场必备神器——个微管理系统,帮助大家提高回复效率! 首先,你可以在系统上设置自动通过好友后自…

聊聊其他之ShowDoc安装部署

聊聊其他之ShowDoc安装部署 Docker离线安装部署 由于很多公司服务器处于内网环境,跟外网阻断,所以需要通过离线的方式进行Docker镜像安装。 Linux环境准备 第一步:检查防火墙,是否关闭。 查看防火墙状态: [rootlo…

java后端方法地址组成解析

本篇文章旨在记录后端方法被调用时,是如何组成的,以及组成的部分。 提示:以下是本篇文章正文内容,下面案例可供参考 一、后端方法地址是什么? 示例:http://127.0.0.1:8080/user/info 如果携带了路径参数…

主存储器的基本组成+容量扩展+与CPU的连接

1.基本组成 1.主存储器的基本组成和读写操作 主存储器被称为主存/内存。是计算机中存储程序的重要部件 主存储器内部包含了存储体、各种逻辑部件以及控制电路等。 主存是通过寻址的方式对存储体内的存储单元进行读写操作的。 主存首先要从MAR获取地址,之后译码器…

Java23种设计模式(五)

1、MVC 模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。 Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。…

惠海H4120 降压IC 40V 36V 30V降压5V3A 9V3A 12V3A 动态响应优异,低纹波

H4120是一款功能优良的异步降压型DC-DC转换器。它的主要特性和优势如下: 产品特性: 内置40V耐压MOS:内置的高耐压MOS使得H4120能够处理更多种的输入电压范围,增强了其适用性和可靠性。 宽输入范围:输入电压可在5V至…

ubuntu18.04 安装HBA

HBA是一个激光点云层级式的全局优化的程序,他的论文题目是:HBA: A Globally Consistent and Efficient Large-Scale LiDAR Mapping Module,对应的github地址是:HKU-Mars-Lab GitHub 学习本博客,可以学到gtsam安装&am…

android串口助手apk下载 源码 演示 支持android 4-14及以上

android串口助手apk下载 1、自动获取串口列表 2、打开串口就开始接收 3、收发 字符或16进制 4、默认发送at\r\n 5、android串口助手apk 支持android 4-14 (Google seral port 太老) 源码找我 需要 用adb root 再setenforce 0进入SELinux 模式 才有权限…

QT day03

思维导图 QT设计 升级优化自己应用程序的登录界面。 要求: 1. qss实现 2. 需要有图层的叠加 (QFrame) 3. 设置纯净窗口后,有关闭等窗口功能。 4. 如果账号密码正确,则实现登录界面关闭,另一个应用界面…

vuejs3+elementPlus后台管理系统,左侧菜单栏制作,跳转、默认激活菜单

默认激活菜单,效果&#xff1a; 默认激活菜单&#xff0c;效果1&#xff1a; 默认激活菜单&#xff0c;效果2&#xff1a; 跳转链接效果&#xff1a; 制作&#xff1a; <script setup> import {useUserStore} from "/stores/userStore.js"; import {ref} fr…

密码学及其应用——GMP库在密码学中的应用

GMP&#xff08;GNU Multiple Precision arithmetic library&#xff0c;GNU多精度算术库&#xff09;是一个针对大整数运算的库。这个库提供了许多针对多种多精度类型的计算函数&#xff1a; - 大整数&#xff1a;Z - 大有理数&#xff1a;Q - 大浮点数&#xff1a;R 1. 密码学…

找不到com.fasterxml.jackson.core.exc.StreamWriteException的类文件

1. 前言: 使用springboot搭建的项目, 需要使用 jackson 更改json文件的内容; maven管理jar包, 导入jar包版本信息如下: <!-- 读写json文件所需依赖 --> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databin…