热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简图记录python基础(二)类、模块与包、异常处理

python基础(一)数据结构、控制流、函数:https:blog.csdn.netrunafterhitarticledetails94908703一

python基础(一)数据结构、控制流、函数:https://blog.csdn.net/runafterhit/article/details/94908703

一 类


1、概念

(1)类:定义类是通过class关键字完成。类似c++,类由数据(属性)和函数(方法)的组成,使用dir(‘类名’)可以查看类的全部属性和方法,创建一个新类意味着创建该类型的实例,也叫类的实例化 。每个类都带有一个__init__函数,在实例时调用对类进行初始化,类似C++构造函数。
(2)python类继承机制允许多个基类,派生类可以覆盖它基类的任何方法,一个方法可以调用基类中相同名称的的方法。对象可以包含任意数量和类型的数据。和模块一样,类也拥有 Python 天然的动态特性:它们在运行时创建,可以在创建后修改。
(3)访问限制,属性的名称前加上两个下划线__,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。(实际的实现就是给名字加了字段修改了名字,不同版本字段不同)

class Dog:def __init__(self): #self 表示创建的实例本身,类似this指针self.color = 'while' # 定义属性 白色self.__name = 'peter' # 定义私有属性def eat(self): # 定义方法,没有self相当于静态方法,只能通过类对象调用print ('i am is eat\n')my_dog = Dog() # 类 的 实例化
my_dog.eat() # 输出 i am is eat
my_dog.__name # 编译报错 'Dog' object has no attribute '__name'

>>> dir ('str')
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

2、面向对象的三大基本特征

(1)封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
(2)继承 :以一个类为基础创建新的类,子类会继承父类的全部属性和方法,继承机制可以很好的描述一个类的生态,也提高了代码复用率。
(3)多态:多态其实是在继承的基础上的,指一个类实例(对象)的相同方法在不同情形有不同表现形式,实现多态有二种方式,覆盖,重载。覆盖,是指子类重新定义父类的虚函数的做法。重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

class Ball:def __init__(self, size, color): self.size = sizeself.color = color def setName(self, name):self.name = namedef play(self):print('play ball\n')class BasketBall(Ball):def __init__(self): super().__init__(10, 'red') # super可以引用父类的def play(self):print('play basketball\n')def shootBall(self):print ('shoot the basketball\n')myBasketball = BasketBall()
myBasketball.setName('myBasketball') # 继承ball的方法
print (myBasketball.name) # 输出 myBasketball
myBasketball.shootBall() # 子类新增的方法,输出 shoot the basketball
myBasketball.play() # 覆盖了父类方法,输出 play basketball

3、其他面向对象特性

(1)python的类,类对象,实例对象的关系。
当定位完类后,直接对类名.属性/方法 进行操作 表示 针对类对象操作。对类进行实例化创建该类的实例对象,对实例对象操作为对实例的操作行为。绝大部分情况下,大家都应该对实例进行操作 ,而非对类对象进行操作。
定义属性时,类下声明的类属性,实例对象可以调用这个变量但不能修改,只有类对象才有资格修改类的属性。实例对象尝试修改了类属性,实际是创建了一个实例的新属性。

class MyCnt:count = 10 #类属性 可以由所有对象访问,但实例对象不能修改,类对象可以def __init__(self):self.instance_count = 0 # (实例)对象属性,每个实例对象各自的属性a = MyCnt() # 创建3个实例对象
b = MyCnt()
c = MyCnt()c.count += 10 # 修改了类属性,实际是创建了一个实例的新属性
print (a.count) # 输出 10
print (b.count) # 输出 10
print (c.count) # 输出 20
MyCnt.count += 20 # 操作 类对象 操作 类属性
print (a.count) # 输出 30
print (b.count) # 输出 30
print (c.count) # 输出 20 ,由于是实例的属性,并未被修改

二 模块与包


1、概念

任何一个大型项目 都会拆解为各种模块,通过各自的源文件管理。
模块:一个包含Python定义和语句的文件。文件名就是模块名后跟文件后缀 .py 。在一个模块内部,模块名(作为一个字符串)可以通过全局变量 name 的值获得。直接执行的入口文件__name__ 为__main__,因此也可以通过是否为main来确定是单独执行当前文件 还是被调用,可以辅助作为自测文件判断条件 进行测试。

def get_max(num1, num2):if num1 >= num2:return num1else:return num2def test():print ('the max in 1 , 2 is ' + str(get_max(1, 2)))if __name__ == '__main__':test()

包:可以理解为管理 包含子包(子文件夹)和 模块 (python文件)的 文件夹 抽象。
包是一种通过用“带点号的模块名”来构造 Python 模块命名空间的方法,能很好的解决模块过多后模块重命名问题。块名 A.B 表示 A 包中名为 B 的子模块。必须要有 init.py 文件才能让 Python 将包含该文件的目录当作包。在最简单的情况下__init__.py 可以只是一个空文件。

sound/ Top-level package__init__.py Initialize the sound packageformats/ Subpackage for file format conversions__init__.pywavread.pywavwrite.pyaiffread.py...filters/ Subpackage for filters__init__.pyequalizer.pyvocoder.py...

2、模块和包的导入

模块被导入的时候,解释器首先寻找具有该名称的内置模块,非内置模块的导入会按照系统路径进行查找导入,可以通过sys.path查看。
导入方式如下:(1)通过import 模块名 可以导入模块;用模块名引用模块中的函数,如fibo.fib(1000)。(2)使用from 模块名 import 函数名称,此时可以直接使用该函数,如fib(1000),此处可以使用*通配符来引用某个模块的全部函数如 from fibo import *,但是不建议这样使用防止冲突覆盖。(3)使用 import 模块名 as 新命名空间,可以使用新命名空间来引用函数。

#当fibo模块中存在一个fib函数 需要使用
import fibo # 可以用模块名fibo引用模块中的函数,如fibo.fib(1000)
from fibo import fibo # 可以直接使用函数名进行访问,fib(1000)
import fibo as fo # 可以用新命名空间fo引用模块中的函数,如fo.fib(1000)

包的导入类似模块。

import sound.effects.echo # 这会加载子模块 sound包中的effects包的echo模块 ,但引用它时必须使用它的全名
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
from sound.effects import echo # 加载子模块 echo ,并使其在没有包前缀的情况下可用
echo.echofilter(input, output, delay=0.7, atten=4)
from sound.effects.echo import echofilter # 直接导入函数
echofilter(input, output, delay=0.7, atten=4)

三 异常处理


1、概念

异常与错误:解析脚本过程语法错误又称解析错误,在执行脚本语句过程检测到的错误被称为异常,比如除0或者打开文件失败。python的异常处理相关语句主要包括:1、异常捕获try expect语句 2、异常抛出 raise语句 。
异常有不同的类型,而其类型名称将会作为错误信息的一部分中打印出来。所有异常必须为一个派生自 BaseException 的类的实例。常见的内置异常类型如下:

AssertionError:当 assert 语句失败时将被引发;
IndexError:当序列抽取超出范围时将被引发;
KeyboardInterrupt:当用户按下中断键 (通常为 Control-C 或 Delete) 时将被引发
MemoryError:当一个操作耗尽内存但情况仍可(通过删除一些对象)进行挽救时将被引发。
NameError:当某个局部或全局名称未找到时将被引发
OSError:系统函数错误引发,如 I/O 操作失败 "文件未找到" 或 "磁盘已满" 等
ZeroDivisionError:当除零时错误将被引发

2、try expect 异常捕捉语句

通过try expect (else)(finally)来捕捉过程抛出的异常,然后进行处理,else和finally为可选子句,finally用于定义必须在所有情况下执行的清理操作。
原理如下:执行 try 子句 (try 和 except 关键字之间的(多行)语句),如果没有异常发生,则跳过 except 子句 并完成 try 语句的执行。如果发生了异常,则跳过该子句中剩下的部分。然后如果异常的类型和 except 关键字后面的异常匹配,则执行 except 子句 ,然后继续执行 try 语句之后的代码。如果发生的异常和 except 子句中指定的异常不匹配,则将其传递到外部的 try 语句中;如果没有找到处理程序,则它是一个 未处理异常,执行将停止并显示错误消息。如果由finally语句,发生异常后一定会执行( 常用于用于保证资源释放);

try:f = open("not exit file")print(f.read())f.close()
except ValueError: # 捕捉系统ValueError异常类型print ("ValueError")
except (TypeError, ZeroDivisionError): # 捕捉系统多种异常print ("TypeError or ZeroDivisionError")
except OSError as reason: # 捕捉系统OS异常类型print ("这里错误原因:" + str(reason))
except :print ('process exception')
else : # (可选语句)没有异常的时候处理流程print ('no error')
finally: # (可选语句)无论如何都会执行的代码,可用于回收资源等print ('error end, release the resoure\n')
# 输出 :
#这里错误原因:[Errno 2] No such file or directory: 'not exit file'
#error end, release the resoure

3、raise 异常抛出语句

raise 语句允许程序员强制发生指定的异常。raise 唯一的参数就是要抛出的异常。这个参数必须是一个异常实例或者是一个异常类(派生自 Exception 的类)。如果传递的是一个异常类,它将通过调用没有参数的构造函数来隐式实例化。

try:raise NameError('HiThere')
except NameError as reasion:print('exception NameError:' + str(reasion))# 输出 exception NameError:HiThere

在这里插入图片描述


推荐阅读
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • 如何在服务器上配置SSL证书
    SSL证书是用于验证互联网上身份的一种数字凭证,通过启用HTTPS协议,确保用户与服务器之间的通信安全。本文将详细介绍如何在API和服务器上配置SSL证书,以提升网站的安全性和可信度。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 解决问题:1、批量读取点云las数据2、点云数据读与写出3、csf滤波分类参考:https:github.comsuyunzzzCSF论文题目ÿ ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
author-avatar
Jingle丶韩静手_247
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有