python进阶(课程学习笔记)
简述Python中的实例方法,类方法,静态方法
1. 实例方法:
与具体的实例相关,会传入一个必须的参数self。self代表被实例化的对象本身。实例方法中能够访问在构造函数__init__()中方初始化的成员变量。
2. 类方法:
与类本身相关的方法。会传入一个必须的参数cls。cls表示当前类,无法通过cls访问构造函数__init__()中创建的成员变量。但是可以在类方法中修改类属性。类方法声明时,需要使用装饰器classmethod进行修饰
3.静态方法:
静态方法,与对象以及类均无关系,不需要传递额外的参数。静态方法需要使用装饰器@staticmethod进行修饰。
# 实例方法
class Person:country = "china" # 类属性 / 需要与self.xxx类数据成员进行区别def __init__(self, name, age, occupation):"""属性定义:param name: public:param age: protected:param occupation: private"""self.name = nameself._age = ageself.__occupation = occupationdef eat(self):"""实例方法,因为第一个参数是self(具体的实例),参数是实例:return:"""print("{} is eating.".format(self.name))@classmethoddef greet(cls):"""类方法,需要添加装饰器,且第一个参数必须是cls(class,类),参数是类:return:"""cls.country = "Russion" # 可以在类方法中修改类属性countryprint("Hello Everyone, I am from {}".format(cls.country))# print("Name is {}".format(cls.name)) # 通过cls也无法访问类中的数据成员@staticmethoddef static_test():"""静态方法不需要传递self或者cls参数,他的操作跟当前的类或者对象没有关系:return:"""print("This is a static method")if __name__ == "__main__":p1 = Person("Sam", 31, "Doctor")p1.eat() # 实例方法# Person.eat() # 报错,无法调用Person.greet() # 类方法,只能通过类调用p1.greet() # 也可以调用# 通过类和对象均可调用静态方法Person.static_test()p1.static_test()
4. python中的继承:
python中实现继承法的方式如下所示:
继承的public,protected类型的数据成员在子类中可以直接访问,private成员无法直接进行访问,续通过调用父类的方式进行获取。
# encoding: utf-8class Person:"""define class person"""def __init__(self, name, age, occupation):self.name = nameself._age = ageself.__occupation = occupationdef get_occupation(self) -> str:return self.__occupationdef get_person_info(self):print("My name is {}, I am {} years old and I am a {}".format(self.name, self._age, self.__occupation))@staticmethoddef _get_passwd(self) -> str:return "123"class Student(Person):def __init__(self, name, age):super(Student, self).__init__(name, age, "Student") # 调用父类的构造函数def print_name(self):print("My name is {}".format(self.name)) # 继承的public成员def print_age(self):print("My age is {}".format(self._age)) # 继承的protected成员def print_occupation(self):print("My work is {}".format(super(Student, self).get_occupation())) # 父类的private在子类中无法直接访问if __name__ == "__main__":s = Student("Sam", 22)s.print_name()s.print_age()s.print_occupation()
5. __new__(cls, *args, **kwargs)
__new__()是用来控制类实例化对象的创建流程,这个方法在对象还没创建之前就会执行,__init__()方法是在创建对象完成执行的。
# encoding: utf-8class Person:def __new__(cls, *args, **kwargs):"""__new__()方法执行完毕后,一定要返回父类Object的__new__方法调用,且只能传递参数cls:param args::param kwargs:"""print("Call the new method!")# 打印参数print(args)print(kwargs)return super().__new__(cls) # 这里必须要返回对象,如果不反悔,则实例化的对象始终为Nonedef __init__(self, name):self.name = nameprint("Name is {}".format(name))if __name__ == "__main__":p = Person("Elly")
执行结果:
若存在继承的情况:
# encoding: utf-8class Person:def __new__(cls, *args, **kwargs):"""__new__()方法执行完毕后,一定要返回父类Object的__new__方法调用,且只能传递参数cls:param args::param kwargs:"""print("Call the new method!")# 打印参数print(args)print(kwargs)return super().__new__(cls) # 这里必须要返回对象,如果不反悔,则实例化的对象始终为Nonedef __init__(self, name):self.name = nameprint("Name is {}".format(name))class Student(Person):def __new__(cls, *args, **kwargs):print("Call the new method student")return super().__new__(cls, name=args[0]) # 父类不是object,可以将参数传递给父类的__new__()方法def __init__(self, name):self.name = nameif __name__ == "__main__":# p = Person("Elly")s = Student("Sam")
执行结果:
6. Python中的单例设计模式
某个类在程序运行期间只能有一个对象被创建:
# 单例设计class User:__instance = None # 定义私有的类属性def __new__(cls, *args, **kwargs):"""在__new__方法中,判断类属性__instance是否为None,如果为None,调用super().__new__()进行创建,赋值给类属性__instance如果__instance已经不为None,则直接返回__instance,这样保证了不管在程序运行中实例化了多少次对象,只会返回最初实例化的那个对象,实现对象的全局唯一。:param args::param kwargs:"""if cls.__instance is None:cls.__instance = super().__new__(cls)return cls.__instancedef __init__(self):pass@classmethoddef get_user(cls):return User()if __name__ == "__main__":user1 = User.get_user()user2 = User.get_user()print(id(user1))print(id(user2))
可以看到实例化两次后返回的是同一个对象:
设计线程安全的单例模式:在上述的单例模式中,如果一个线程在实例化对象的过程中,判断到类属性__instance为None,则会去super().__new__()创建一个新的对象,如果此时实例化过程未结束,类属性__instance依然为空,另一个线程又去实例化对象,则后面线程创建的对象会将前面线程创建的对象覆盖。
7. 异常处理:
具体语法格式
if __name__ == "__main__":a = 3b = 0c = 0try: # 捕获异常的区域c = a / bexcept Exception: # 捕获的异常的具体类型,Exception表示捕获所有异常print("Exception appeared!")else:print("Result is {}".format(c)) # 没有捕获到异常finally:print("End the routine") # 不管有没有异常都会执行的代码区域
可以写多个except捕获多种类型的异常:
if __name__ == "__main__":a = 3b = 5c = 0try: # 捕获异常的区域c = a / bprint(d) # 未定义变量except ZeroDivisionError: # 捕获的异常的具体类型,Exception表示捕获所有异常print("Can not divide zero!")except NameError:print("variable is not defined!")else:print("The result is {}".format(c)) # 没有捕获到异常finally:print("End the routine") # 不管有没有异常都会执行的代码区域
也可以通过下面的方式打印异常信息:
except NameError as error:print("variable is not defined!")print(error.args)
8. 抛出异常:
def greet(name, age):""":param name::param age::return:"""if not isinstance(name, str):raise TypeError("name must be a string.") # 抛出异常if not isinstance(age, int):raise TypeError("age must be int") # 抛出异常print("I am {} and {} years old".format(name, age))if __name__ == "__main__":try:greet("Tom", "1")except TypeError as error:print(error.args)
9. 自定义异常
自定义异常需要继承自Exception类
def greet(name, age):""":param name::param age::return:"""if not isinstance(name, str):raise ArgumentError("name must be a string.") # 抛出异常if not isinstance(age, int):raise ArgumentError("age must be int") # 抛出异常print("I am {} and {} years old".format(name, age))class ArgumentError(Exception):def __init__(self, *args, **kwargs):tmp_args = args + ("参数错误", )super(ArgumentError, self).__init__(*tmp_args)if __name__ == "__main__":try:greet("Tom", "1")except ArgumentError as error:print(error.args)
python常见异常:
异常名称 | 异常说明 |
AttributeError | 属性错误,访问一个对象的不存在的属性的时候,抛出这个异常 |
ImportError | 导入包错误 |
IndexError | 下标错误,一般有列表越界等 |
KeyError | key错误,一般访问字典的key不存在的时候 |
NameError | 变量名不存在 |
NotImplementedError | 某个方法没有实现的错误 |
StopIteration | 迭代器已经到最后了 |
IndentationError | 缩进错误 |
TabError | 包含了tab和空格错误 |
TypeError | 类型错误,有时候传递了一个错误类型的值给其他函数 |
UnicodeEncodeError | Unicode编码错误,一般是unicode->str错误 |
UnicodeDecodeError | Unicode解码错误,一般是str->unicode错误 |
ValueError | 值错误,比如传一个12a给int()函数转换 |
ZeroDivisionError | 除0错误 |
IOError | 打开一个不存在的文件(在Python3中使用FileNotFoundError) |
FileNotFoundError | 文件没有找到的错误 |
9. python模块导入
在大型项目中,将所有的代码都放到一个文件中不利于代码维护。python中通过模块和包将不同文件中相关的代码整合到一个文件中。
python中的包:包本质上是一个文件夹,将相关的模块组合到一起。如果一个文件夹想被python识别为一个包,则必须在这个文件夹中创建一个__init__.py的文件。此时这个文件夹就能被python识别为一个包。在一个包中的模块,通过import可以相互导入。
在python中导入包,在使用import的时候,是按照特定的路径去查询相应的包是否存在,可以通过sys模块来查询路径的列表,在import相应的包的时候,python是按照如下的路径列表去查找代码中的包或者模块是否存在:
import sys
print(sys.path)
python会按照上述的路径列表进行查找相应的包。
包中的模块在执行import导入模块的时候,可以采用两种方式,相对路径导入和绝对路径导入
from ..modulename import 相对路径上级目录
form .modulename import 相对路径当前目录
__all__变量:可以控制from modulename import * 的行为,如果__all__ = [ ]列表中指定了相应的变量,函数,或者类,import * 的时候只会导入__all__变量中的内容。
在__init__.py中导入的模块,才可以通过包名直接导入,否则不会导入成功,可以在__init__.py中通过__all__ = [ ] 控制import *的导入行为。
python进阶(课程学习笔记)相关推荐
- vn.py全实战进阶课程学习笔记(零)
目录 写在前面 MySQL数据库配置 安装mysq 创建数据库 vnpy数据库配置 rqdata数据服务配置 申请rqdata试用权限 vnpy参数配置 simnow仿真环境配置 准备账号 接口登录 ...
- Android推送进阶课程学习笔记
今天在慕课网学习了Android进阶课程推送的server端处理回执的消息 . 这集课程主要介绍了,当server往client推送消息的时候,client须要发送一个回执回来确认收到了推送消息才算一 ...
- 干货 | Python进阶之学习笔记(一)
认识Python Python应用场景 Python基础语法 一.认识Python Python 是一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,最初被设计用于编写自动化脚本(shell) ...
- python基础课程学习笔记-第二节课
1.Python语⾔ 1.1 Python语⾔的基本概念 Python 是⼀种极少数能兼具 简单 与 功能强⼤ 的编程语⾔.你将惊异于发 现你正在使⽤的这⻔编程语⾔是如此简单,它专注于如何解决问题,⽽ ...
- python进阶之学习笔记_干货 | Python进阶系列之学习笔记(二)
目录 对象 字符串 一.对象 (1)什么是对象 在python中一切都是对象,每个对象都有三个属性分别是,(id)身份,就是在内存中的地址,类型(type),是int.字符.字典(dic).列表(li ...
- python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)
目录 Python条件判断 Python循环语句 Python循环控制 迭代器与生成器 异常 一.Python 条件判断 如果某些条件满足,才能做某件事情:条件不满足时,则不能做,这就是所谓的判断. ...
- 【黑马-python进阶】---学习笔记(7)---线程、进程、协程、正则表达式
4 多任务-线程 4.1 多任务介绍 目标 知道多任务概念 多任务和单任务程序的区别 1.多任务解析 操作系统可以同时运行多个任务,现在,多核CPU已经非常普及,但是,即使过去的单核CPU,也可以执行 ...
- Python课程学习笔记 上
笔记目录 学前准备 Python解释器安装包 下载 安装 Pycharm 下载 常用的快捷键 Python程序执行机制 语法基础 注释和中文乱码 变量 数据类型 运算符 数值运算符 复合运算符 比较运 ...
- 台湾大学林轩田机器学习技法课程学习笔记1 -- Linear Support Vector Machine
红色石头的个人网站:redstonewill.com 关于台湾大学林轩田老师的<机器学习基石>课程,我们已经总结了16节课的笔记.这里附上基石第一节课的博客地址: 台湾大学林轩田机器学习基 ...
最新文章
- RegularExpressions(4) RegularExpressions 成员(一)
- spring security remember me实现自动登录
- 隐藏快捷方式扩展名(.lnk)
- 在linux上执行.net Console apps
- 《编码规范和测试方法——C/C++版》作业 ·005——设计一组员工类
- jsp文件过大,is exceeding 65535 bytes limit
- php利用curl实现多进程下载文件类
- M2增速8%处于历史地位——解读10月货币数据
- Laravel——微信授权登陆
- npm ERR! extraneous:的解决方案
- 【附源码】计算机毕业设计java医院人事及科室病区管理设计与实现
- Hazelcast源码剖析之Eviction
- JQuery序列化和反序列化
- lo4net的简单运用
- Chinaren校友录所用的左边弹出式菜单
- SQLserver的Always On 可用性组
- LeetCode刷题实战1:在数组上遍历出花样
- Java根据两点经纬度计算距离
- CAR-T细胞疗法最新研究进展
- 【爬虫实践】获取某城市天气数据
热门文章
- SAAS多租户实现方案_springboot 实现多租户_基于数据库服务器隔离_或共享数据库服务器_但隔离数据库---springcloud工作笔记159
- 深度学习001---勾股定理
- 嵌入式电路设计(51单片机电路设计)
- 随想录(英语学习的几个误区)
- 随想录(协议栈的基本技术)
- 找mysql软件的配置文件_mysql 查看当前使用的配置文件my.cnf的方法
- echarts折线图怎么从y轴开始_基于echarts的双y轴实时更新折线图
- AD教程系列 | 1-认识基本电子元器件、封装和读数
- 带父节点的平衡二叉树_平衡二叉树 通俗易懂
- sql如何遍历几百万的表_SQL Server中遍历表中记录的方法