简述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常见异常:

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进阶(课程学习笔记)相关推荐

  1. vn.py全实战进阶课程学习笔记(零)

    目录 写在前面 MySQL数据库配置 安装mysq 创建数据库 vnpy数据库配置 rqdata数据服务配置 申请rqdata试用权限 vnpy参数配置 simnow仿真环境配置 准备账号 接口登录 ...

  2. Android推送进阶课程学习笔记

    今天在慕课网学习了Android进阶课程推送的server端处理回执的消息 . 这集课程主要介绍了,当server往client推送消息的时候,client须要发送一个回执回来确认收到了推送消息才算一 ...

  3. 干货 | Python进阶之学习笔记(一)

    认识Python Python应用场景 Python基础语法 一.认识Python Python 是一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,最初被设计用于编写自动化脚本(shell) ...

  4. python基础课程学习笔记-第二节课

    1.Python语⾔ 1.1 Python语⾔的基本概念 Python 是⼀种极少数能兼具 简单 与 功能强⼤ 的编程语⾔.你将惊异于发 现你正在使⽤的这⻔编程语⾔是如此简单,它专注于如何解决问题,⽽ ...

  5. python进阶之学习笔记_干货 | Python进阶系列之学习笔记(二)

    目录 对象 字符串 一.对象 (1)什么是对象 在python中一切都是对象,每个对象都有三个属性分别是,(id)身份,就是在内存中的地址,类型(type),是int.字符.字典(dic).列表(li ...

  6. python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)

    目录 Python条件判断 Python循环语句 Python循环控制 迭代器与生成器 异常 一.Python 条件判断 如果某些条件满足,才能做某件事情:条件不满足时,则不能做,这就是所谓的判断. ...

  7. 【黑马-python进阶】---学习笔记(7)---线程、进程、协程、正则表达式

    4 多任务-线程 4.1 多任务介绍 目标 知道多任务概念 多任务和单任务程序的区别 1.多任务解析 操作系统可以同时运行多个任务,现在,多核CPU已经非常普及,但是,即使过去的单核CPU,也可以执行 ...

  8. Python课程学习笔记 上

    笔记目录 学前准备 Python解释器安装包 下载 安装 Pycharm 下载 常用的快捷键 Python程序执行机制 语法基础 注释和中文乱码 变量 数据类型 运算符 数值运算符 复合运算符 比较运 ...

  9. 台湾大学林轩田机器学习技法课程学习笔记1 -- Linear Support Vector Machine

    红色石头的个人网站:redstonewill.com 关于台湾大学林轩田老师的<机器学习基石>课程,我们已经总结了16节课的笔记.这里附上基石第一节课的博客地址: 台湾大学林轩田机器学习基 ...

最新文章

  1. RegularExpressions(4) RegularExpressions 成员(一)
  2. spring security remember me实现自动登录
  3. 隐藏快捷方式扩展名(.lnk)
  4. 在linux上执行.net Console apps
  5. 《编码规范和测试方法——C/C++版》作业 ·005——设计一组员工类
  6. jsp文件过大,is exceeding 65535 bytes limit
  7. php利用curl实现多进程下载文件类
  8. M2增速8%处于历史地位——解读10月货币数据
  9. Laravel——微信授权登陆
  10. npm ERR! extraneous:的解决方案
  11. 【附源码】计算机毕业设计java医院人事及科室病区管理设计与实现
  12. Hazelcast源码剖析之Eviction
  13. JQuery序列化和反序列化
  14. lo4net的简单运用
  15. Chinaren校友录所用的左边弹出式菜单
  16. SQLserver的Always On 可用性组
  17. LeetCode刷题实战1:在数组上遍历出花样
  18. Java根据两点经纬度计算距离
  19. CAR-T细胞疗法最新研究进展
  20. 【爬虫实践】获取某城市天气数据

热门文章

  1. SAAS多租户实现方案_springboot 实现多租户_基于数据库服务器隔离_或共享数据库服务器_但隔离数据库---springcloud工作笔记159
  2. 深度学习001---勾股定理
  3. 嵌入式电路设计(51单片机电路设计)
  4. 随想录(英语学习的几个误区)
  5. 随想录(协议栈的基本技术)
  6. 找mysql软件的配置文件_mysql 查看当前使用的配置文件my.cnf的方法
  7. echarts折线图怎么从y轴开始_基于echarts的双y轴实时更新折线图
  8. AD教程系列 | 1-认识基本电子元器件、封装和读数
  9. 带父节点的平衡二叉树_平衡二叉树 通俗易懂
  10. sql如何遍历几百万的表_SQL Server中遍历表中记录的方法