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

news2025/2/1 7:46:40

 

目录

一、多态和类名

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 = name

    def 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 = name

    def 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 = name
        self.__age = 1

    def 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 = 0
        for i in args:
            m += i
        return m
sum1 = MyMath.sum(1,2,3,4,5)
print(sum1)

2.静态方法

格式:

@staticmethod

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

        pass

调用方式:

        同类方法

        类对象.静态方法名()

设计目的:

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

作用:

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

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

class EncodeUtil(object):

    @staticmethod
    def encode_data(data,format):
        print(f'对数据{data} 使用 {format} 格式进行编码')

    @staticmethod
    def 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 sys

print(os.getcwd())

#阻塞函数
time.sleep(3)

print(sys.argv)

2.自动模块导入

n = 1

def 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 m

m.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.a

print(normal.a.m)

from import

from normal import a

print(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 = msg
    def __str__(self):
        return self.__msg

class PhoneNumberLengthError(Exception):
    def __init__(self,msg):
        self.__msg = msg
    def __str__(self):
        return self.__msg

def 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 = msg
    def __str__(self):
        return self.__msg

class PhoneNumberLengthError(Exception):
    def __init__(self,msg):
        self.__msg = msg
    def __str__(self):
        return self.__msg

def 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.coloradmin.cn/o/631407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【运筹优化】最短路算法之A星算法 + Java代码实现

文章目录 一、A星算法简介二、A星算法思想三、A星算法 java代码四、测试 一、A星算法简介 A*算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 二、A星算…

day52_Spring

今日内容 零、 复习昨日 一、Spring 零、 复习昨日 一、引言 以前 public class HelleServlet extends HttpServlet{UserService service new UsrServiceImpl();void doGet(){service.findUser();} }public interface UserService{User findUser(); } public class UserServ…

Tigase-Server 8.3.0在windows11下安装

一、JDK安装: tigase-server要求JDK 17,请先下载JDK17, 下载地址:https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe 配置环境变量:JAVA_HOME{JDK安装目录} 二、数据库安装:tigase-server8.3在windows下…

【算法系列 | 4】深入解析排序算法之——归并排序

序言 你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 决定开一个算法专栏,希望能帮助大…

Chrome内核插件开发报错:Unchecked runtime.lastError:的原因及解决办法。

本篇文章主要讲解,chrome内核插件开发时报错:Unchecked runtime.lastError: Extensions using event pages or Service Workers must pass an id parameter to chrome.contextMenus.create 的原因及解决办法。 日期:2023年6月10日 作者:任聪聪 报错现象: 查看报错路径,在…

项目经理必备!这四个高效管理工具帮你实现项目管理目标

在项目管理中,图形工具可以帮助我们让项目信息可视化,让项目管理更加高效,对于项目经理而言,这些工具都是好帮手。让我们一起看看,项目经理常用的管理工具都有那些吧~ 1,甘特图 甘特图是计划和管理项目的好…

【Spring使用注解更简单的实现Bean对象的存取】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、前言: 二、储存Bean对象和使…

天黑的时候如果下雨了,会比平常更亮一些

目录 一、最近的感受 二、自我的审视 三、如何变得强大 1.保持善良 2.不过度追求公平 3.在痛苦中找到自己的意义 4.令人振奋的生命力 四、情绪调节中的个人见解及如何处理情绪后的学习 1.运动 2.散步 3.找好朋友倾诉 五、总结 一、最近的感受 天黑的时候如果下雨了…

设计模式(十一):结构型之组合模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

C语言:写一个代码,使用 试除法 打印100~200之间的素数(质数)

题目: 使用 试除法 打印100~200之间的素数。 素数(质数):一个数只能被写成一和本身的积。 如:7只能写成1*7,那就是素数(质数)了。 思路一:使用试除法 总体思路&#xff…

HTML5 介绍

目录 1. HTML5介绍 1.1 介绍 1.2 内容 1.3 浏览器支持情况 2. 创建HTML5页面 2.1 <!DOCTYPE> 文档类型声明 2.2 <html>标签 2.3 <meta>标签 设置字符编码 2.4 引用样式表 2.5 引用JavaScript文件 3. 完整页面示例 4. 资料网站 1. HTML5介绍 1.1 介绍 …

带你手撕一颗红黑树

红黑树&#xff08;C&#xff09; 红黑树简述红黑树的概念红黑树的性质红黑树结点定义 一&#xff0c;红黑树的插入插入调整插入代码 二&#xff0c;红黑树的验证三&#xff0c;红黑树的删除待删除的结点只有一个子树删除结点颜色为红色删除结点颜色为黑色 删除的结点为叶子节点…

直流稳压电源与信号产生电路(模电速成)

目录 一、直流稳压电源 1、直流稳压电路 2、串联型稳压电路 3、集成稳压电路 二、信号产生电路 1、振荡电路 2、波形发生器 一、直流稳压电源 1、直流稳压电路 直流电源由 变压器、整流、滤波、稳压 四部分组成 整流&#xff1a;将交流变为直流 滤波&#xff1a;减小…

AI人工智能之科研论文搜索集锦

AI人工智能之科研论文搜索集锦 前言1. Google学术搜索2. Google搜索3. Arxiv#Example&#xff1a; 4. Github#Example&#xff1a; 5. Paperwithcode6. Connectedpapers7. OpenReview 总结 前言 如今越来越多领域都会与计算机、人工智能方面进行跨领域融合&#xff0c;一个万物…

帮忙投票的链接怎么弄的微信怎么创建投票链接设置投票

近些年来&#xff0c;第三方的微信投票制作平台如雨后春笋般络绎不绝。随着手机的互联网的发展及微信开放平台各项基于手机能力的开放&#xff0c;更多人选择微信投票小程序平台&#xff0c;因为它有非常大的优势。 1.它比起微信公众号自带的投票系统、传统的H5投票系统有可以图…

EMC学习笔记(二)模块划分及特殊器件的布局

模块划分及特殊器件的布局 1.模块划分1.1 按功能划分1.2 按频率划分1.3 按信号类型划分1.4 综合布局 2.特殊器件的布局2.1 电源部分2.2 时钟部分2.3 电感线圈2.4 总线驱动部分2.5 滤波器件 谈PCB的EMC设计,不能不谈PCB的模块划分及关键器件的布局。这一方面是某些频率发生器件、…

day51_mybatis

今日内容 零、 复习昨日 一、缓存 二、单例设计模式 零、 复习昨日 多表联查的时候 扩展类写接口设计方法写sql语句 不能直接映射成实体类resultMap 一对一 axxxxxxx一对多 collection 一、$和#的区别 使用# 使用$ 总结: #{} 相当于是预处理语句,会将#换成占位符?,字符串等…

【c语言进阶】深入挖掘数据在内存中的存储

深入挖掘数据在内存中的存储 数据类型介绍数据类型基本分类及其大小 整形在内存中的存储方式原码、反码、补码大小端介绍判断一个系统是大端还是小端 char与unsigned char值范围与图解整形存储相关练习题 浮点数在内存中的存储方式浮点数存储规则案列 结语 铁汁们&#xff0c;今…

计算机网络填空题

我会写下自己的答案和理解 希望自己可用在学习中体会到快乐&#xff0c;而不是麻木。 1. 网络协议三要素中语义是指 需要发出何种控制信息&#xff0c;完成何种动作以及做出何种响应 1.在计算机网络中要做到有条不紊的交换数据&#xff0c;就必须遵守一些事…

算法刷题-链表-移除链表元素

链表操作中&#xff0c;可以使用原链表来直接进行删除操作&#xff0c;也可以设置一个虚拟头结点再进行删除操作&#xff0c;接下来看一看哪种方式更方便。 203.移除链表元素 力扣题目链接 题意&#xff1a;删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&…