python面向对象操作3(速通版)

news/2024/10/23 5:45:04/

 

目录

一、多态和类名

1.标准多态

2.实例属性和实例方法

3.类对象和类属性

4.对象保存

二、方法

1.类方法

3.四种方法的区别

三、模块

1.导入模块

2.自动模块导入

3.模块导入的几种形式

3.1模块导入的两种方式和别名

3.2 from 模块 import 成员

4.两种方法的区别和问题

7.包和模块

8.__init__和__all__属性的特性

9.小结

四、异常处理

1.基本异常处理

2.异常的传递

3.捕捉多个异常

4.else和finally

5.自定义异常抛出

结语


一、多态和类名

多种形态

程序中的意义:

当调用一个方法名的时候,得到的结果不同

在一般面向对象语言中,多态是由继承来实现的

但是在python中,python天生具有多态

1.标准多态

class Father(object):def cure(self):print("中医")class Son(Father):def cure(self):print("中西医结合")class Person(object):#需要一个大夫治病def need_docter(self,doctor):doctor.cure()p = Person()p.need_docter(Father())
p.need_docter(Son())

2.实例属性和实例方法

class Cat(object):def __init__(self,name):self.name = namedef info(self):print(self.name)def show(self):print("show")self.info()tom = Cat('tom')
#使用实例属性
print(tom.name)
#实例方法
tom.info()
tom.show()

实例方法

class Cat(object):def __init__(self,name):self.name = namedef info(self):print(self.name)def show(self):print("show")self.info()tom = Cat('tom')
#使用实例属性
print(tom.name)
#实例方法
tom.info()
tom.show()
Cat.show(tom)#类名不能调用对象属性
print(Cat.name)

3.类对象和类属性

4.对象保存

class Cat(object):def __init__(self,name):self.name = nameself.__age = 1def public_meth(self):print("公有对象方法")def __priv_meth(self):print("私有对象方法")tom = Cat('Tom')jack = Cat('Jack')print(Cat.__dict__)
print(tom.__dict__)
print(jack.__dict__)tom.public_meth()Cat.public_meth(tom)


二、方法

1.类方法

定义格式:和写普通方法没什么区别,就是有个修饰

调用格式

应用场景

注意:类方法中不能使用self,但是可以使用其他对象填充cls,当前类对象,这个参数也是自动传递的

class MyMath(object):#定义一个类属性n = 999@classmethod#cls默认是这个类对象def sum(cls,*args):m = 0for i in args:m += ireturn m
sum1 = MyMath.sum(1,2,3,4,5)
print(sum1)

2.静态方法

格式:

@staticmethod

def 方法名(参数列表。。。):

        pass

调用方式:

        同类方法

        类对象.静态方法名()

设计目的:

静态方法实际上就是放到类中的一堆普通函数

作用:

        静态方法同类方法相似,也是在不需要实例对象产生的条件下,可以使用静态方法来实现

        一般这两种方法,都是用在工具类的实现上

class EncodeUtil(object):@staticmethoddef encode_data(data,format):print(f'对数据{data} 使用 {format} 格式进行编码')@staticmethoddef decode_data(data,format):print(f'对数据{data} 使用 {format} 格式进行解码')EncodeUtil.encode_data("hello",'utf-8')EncodeUtil.decode_data("hello", 'GBK')

3.四种方法的区别

# 实例方法,必须通过实例对象调用执行,(第一个参数是当前调用该方法的实例)

# 类方法:当不需要产生实例对象时,可以使用类方法来实现显影的代码功能,类方法可以直接使用类对象来调用,类方法的第一个参数时cls,用来接收当前类对象,通过各个参数,可以在各个类方法中进行共享数据

# 静态方法:作用同类方法相似,但是静态方法不接收任何默认参数(实例对象或类对象),静态方法其实就是将一些相关联的普通方法进行类的整合

类方法和静态方法大多数用来实现工具类


三、模块

在python中,一个py文件就是一个模块

模块也是对象

1.导入模块

import os

import time

import random

import sys

import functools

import os
import time
import sysprint(os.getcwd())#阻塞函数
time.sleep(3)print(sys.argv)

2.自动模块导入

n = 1def show():print("mode show")class Cat(object):def show(self):print("Cat_show")print('mode ',n)
show()
c = Cat()
c.show()

我们导入到main里面

#导入模块时,需要去创建该模块的对象,也就会去执行该模块文件中的所有代码

import mode

3.模块导入的几种形式

3.1模块导入的两种方式和别名

 

#导入模块时,需要去创建该模块的对象,也就会去执行该模块文件中的所有代码
import mode#模块名调用
print("___________________")
print(mode)
mode.show()
print("____________________")#类对象模块名调用
rom = mode.Cat()
rom.show()print("____________________")#别名
import mode as mm.show()m.Cat().show()

3.2 from 模块 import 成员

from mode import n
print("____________________________________________")
print(n)from mode import show
print("____________________________________________")
show()
#起别名
from mode import Cat as C
print("____________________________________________")
C().show()#导出所有
from mode import *
print("____________________________________________")
Cat().show()
show()
print(n)

4.两种方法的区别和问题

main导入

#import没有限制
import mode as m
print(m.x)
print(m._y)
print(m.__z)

用from import导入

#import没有限制
from mode import *
print(x)
print(_y)
print(__z)

可以通过__all__来解决这个问题

但是我们不提倡用这个方法

#改变规则来让私有属性能被引用
__all__ = ['x','_y','__z']x = 1   #全局变量,模块间的公有变量
_y = 2  #私有变量,文件内私有变量
__z = 3 #私有变量,对象私有或类私有,不会直接在模块中定义

main


#import没有限制
from mode import *
print(x)
print(_y)
print(__z)

5.模块导入顺序

6.__name__属性

 mode模块

n = 1
def show():print('show')class Cat(object):def show(self):print("Cat_show")#当使用__name__属性在获取当前模块名时,会有两种效果
print('name: ',__name__)

main


import mode#这里运行是代表人口
print('name2: ',__name__)

前面我们载入模块会自动执行一些调用的方法,我们可以用__name__来解决这个问题

n = 1
def show():print('show')class Cat(object):def show(self):print("Cat_show")#当使用__name__属性在获取当前模块名时,会有两种效果
print('name: ',__name__)if __name__ == '__main__':print(n)show()Cat().show()

import mode#这里运行是代表人口
print('name2: ',__name__)

 

7.包和模块

导入包中的模块

调用

import normal.aprint(normal.a.m)

from import

from normal import aprint(a.m)

8.__init__和__all__属性的特性

目录结构

cn.ou.web.*

当在使用import方式,或from-import方式导入包时,需要在__init__.py文件中,明确的指出可以被导入的模块有哪些。

使用from . import 模块名形式指定

如果在该文件中没有指定可以调入的模块时,默认不导入任何模块

from cn.ou import web
print(web.a.m)
print(web.b.c)

from cn.ou import web
print(web.a.m)
print(web.b.c)

__all__导入方式

__all__ = ['a','b']  #导入a,b模块#__all__ = ['a']

from import才可以导入__all__

from cn.ou.web import *
print(a.m)
print(b.c)

9.小结


四、异常处理

1.基本异常处理

常见异常

这些错误都继承于Exception

index函数报错

s = "hello"print(s.index('O'))print('over')

这个函数错误不会返回null,而是直接抛出一个异常,中断程序

那么我们捕获这个异常让他继续运行

s = "hello"try:print(s.index('O'))
except ValueError:print("查找的字串不存在")

因为异常原因可能不知道,所以可以用Exception来接收这个异常,来抛出

s = "hello"try:print(s.index('O'))
except Exception:print("查找的字串不存在")

2.异常的传递

当代码出现了很多层级的调用时,在其中发生了异常,如果没有处理这个异常,那么这个异常会自动向上抛出,如果上层也没有处理,就会继续向上抛出,知道抛到解释器。

解释器默认处理异常的方式就是中断程序,将异常信息显示到工作台上

def func_a():print("Func a run...")func_b()def func_b():print("Func b run...")func_c()def func_c():print("Func c run...")print(1/0)func_a()

处理掉这个异常

def func_a():print("Func a run...")func_b()def func_b():print("Func b run...")func_c()def func_c():print("Func c run...")try:print(1/0)except Exception:print('你的除数为0了')func_a()

3.捕捉多个异常

def func_a():print("Func a run...")func_b()def func_b():print("Func b run...")func_c()def func_c():print("Func c run...")try:print(1/0)except (ZeroDivisionError,NameError) as e:print('出现异常了',e)func_a()

4.else和finally

打开文件问题

try:f = open('a.txt','r')
except Exception as e:print("要打开的文件不存在")print(e)

else

无文件报异常

try:f = open('a.txt','r')
except Exception as e:print("要打开的文件不存在")print(e)
else:print(f.read())

有文件直接读取输出

try:f = open('a.txt','r')
except Exception as e:print("要打开的文件不存在")print(e)
else:print(f.read())f.close()

finally无论是否出现异常,都会执行finally语句块

try:f = open('a.txt','r')
except Exception as e:print("要打开的文件不存在")print(e)
else:print(f.read())
finally:f.close()

a.txt不存在时

这下又有异常了

这个问题处理

f = None
try:f = open('a.txt','r')
except Exception as e:print("要打开的文件不存在")print(e)
else:print(f.read())
finally:if f != None:f.close()

5.自定义异常抛出

raise 异常对象

class PhoneNumberNotDigitError(Exception):def __init__(self,msg):self.__msg = msgdef __str__(self):return self.__msgclass PhoneNumberLengthError(Exception):def __init__(self,msg):self.__msg = msgdef __str__(self):return self.__msgdef get__phone_number():pn = input("请输入一个11位的手机号:")if pn.isdigit() == False:raise PhoneNumberNotDigitError("请输入正确的手机号码")elif len(pn) != 11:raise PhoneNumberLengthError('手机号位数不正确')print("输入的手机号是合法的: ",pn)get__phone_number()

输入a1234567890

输入正常格式的手机号

输入长度超过的数字

from import引用


class PhoneNumberNotDigitError(Exception):def __init__(self,msg):self.__msg = msgdef __str__(self):return self.__msgclass PhoneNumberLengthError(Exception):def __init__(self,msg):self.__msg = msgdef __str__(self):return self.__msgdef get__phone_number():pn = input("请输入一个11位的手机号:")if pn.isdigit() == False:raise PhoneNumberNotDigitError("请输入正确的手机号码")elif len(pn) != 11:raise PhoneNumberLengthError('手机号位数不正确')return pn
from mode import *try:num = get__phone_number()
except(PhoneNumberLengthError,PhoneNumberNotDigitError) as e:print(e)
else:print(num)


结语

双休了!光速更新!!!求点赞


http://www.ppmy.cn/news/312984.html

相关文章

【博客654】prometheus配置抓取保护以防止压力过载

prometheus抓取保护配置以防止压力过载 场景 担心您的应用程序指标可能突然激增,以及指标突然激增导致prometheus压力过载 就像生活中的许多事情一样,标签要有节制。当带有用户 ID 或电子邮件地址的标签被添加到指标时,虽然它不太可能结束…

UniApp响应式布局

前言 UniApp 是一款基于 Vue.js 开发的跨平台应用开发框架,可以同时构建 iOS、Android、H5 等多个平台的应用。在 UniApp 中,单位(Unit)是一个非常重要的概念,它决定了应用在不同设备上的布局和样式,要适应…

【进程间通信:管道】

目录 1 进程间通信介绍 1.1 进程间通信目的 1.2 进程间通信发展 1.3 进程间通信分类 2 管道 2.1 什么是管道 2.2 匿名管道 2.2.1 匿名管道的使用 2.2.2 使用匿名管道创建进程池 2.3 管道读写规则 2.4 匿名管道特点 2.5 命名管道 2.5.1 概念 2.5.2 使用 1 进程间通…

【收藏】通信知识分类整理

5G专题 有史以来最强的5G入门科普! 超简单!学习5G的正确姿势! 深度解析:5G与未来天线技术(转载) 5G核心网,到底长啥样?从2G到5G,核心网,你到底经历了什么&am…

元宇宙系统全面学习线路

问题导读 1.元宇宙已经发展了多少年? 2.元宇宙是什么? 3.元宇宙有哪些概念? 4.元宇宙支持技术有哪些? 5.元宇宙和VR有什么区别? 6.元宇宙有哪些机会? 7.元宇宙如何开发,有哪些赛道? 元宇宙的发…

云计算与大数据技术应用 第二章

大数据技术概述 大数据技术的产生 大数据的基本概念 1、什么是大数据?大数据(Big data或Megadata):大数据,或称巨量数据、海量数据、大资料,指的是所涉及的数据量规模巨大到无法通过人工,在合…

我在华为做外包的真实经历!

1 写在前面 我将用系列文章,回顾十年程序生涯,一方面是对职场生涯的阶段性总结,另一方面希望这些经历,对大家往后职场生涯有所启发。 我很庆幸一路走来皆是自己的选择,虽然也走了不少弯路,但那是我选择的生…

安图恩频道一直连接服务器,DNF里最让大家不爽的事,安图恩频道什么时候能换服务器...

原标题:DNF里最让大家不爽的事,安图恩频道什么时候能换服务器 玩DNF的时候你经历过绝望吗? 我想,最大的绝望是打团掉线,或者网络波动让你不能安心打团。 进跨区组队进团,一心欢喜的买票等开,却没…