【Python】学习笔记总结2(Python面向对象)
文章目录
- 二、Python面向对象
- 1.类(Class)
- 1.1.定义类
- 1.2.类属性
- 1.3.实例属性
- 1.3.1.内部添加
- 1.3.2.外部添加
- 1.4.实例方法
- 1.5.类方法
- 1.6.静态方法
- 1.7.__init__方法(初始化)
- 1.8.Self(当前对象的引用)
- 1.9.魔术方法
- 1.9.1.魔术方法介绍大全
- 2.方法、继承、多态
- 2.1.析构方法`__del__ `
- 2.1.1.释放对象时调用
- 2.1.2.手动清空对象
- 2.2.继承
- 2.2.1.单继承
- 2.2.2.多继承
- 2.2.3.重写父类方法
- 2.2.4.重写`__init__`方法
- 2.2.4多态
- 2.3类属性和实例属性区别
- 2.4类方法和实例方法和静态方法
- 3.封装与单例
- 3.1.封装
- 3.2.单例模式
- 3.3.异常处理
- 3.3.1.异常类型
- 3.3.2.自定义异常类型
- 3.4.动态添加属性和方法
二、Python面向对象
1.类(Class)
1.1.定义类
class Person :name = '小明'#类属性age = '20'#类属性def eat(self):print('吃饭')passpass
- 使用
xiaoming = Person()
1.2.类属性
在类的内部,使用def关键字定义且有类似(self)的,使用权归实例所有
name = '小明'#类属性
1.3.实例属性
1.3.1.内部添加
在方法的内部,使用self引用的属性
def __init__(self):self.friend = '小红'
1.3.2.外部添加
class People :def eat(self):print(self)passpassxiaoming = People()
xiaoming.name = '小明'
xiaoming.age = 20
print(xiaoming.name)
1.4.实例方法
在类的内部,使用def关键字定义且有类似(self)的,使用权归实例所有
def eat(self):print('吃饭')passpass
1.5.类方法
类对象所拥有的方法,用装饰器@classmethod来标
识其为类方法,对于类方法,第一个参数必须是类对象,
一般以cls作为第- -个参数,
类方法可以通过类对象,实例对象调用
类方法可以访问、修改类属性
name = '小明'@classmethoddef findNameInfo(cls):return cls.namepass
1.6.静态方法
静态方法不需要传参例如(cls/self)
静态方法不可以访问类属性
通常用类直接访问静态方法,本身和类与实例无关
import time
class Test :def __init__(self,hour,min,second):self.hour = hourself.min = minself.second = second@staticmethoddef showTime():return time.strftime("%H:%M:%S" ,time.localtime())pass
passprint(Test(1,2,3).showTime())
1.7.__init__方法(初始化)
*类似于构造函数,对self的属性进行构造
自动执行的初始化方法,自带的内置函数
class People :def __init__(self,name,age):self.name = nameself.age = agepassdef showInfo(self):print(self.name+'年龄'+self.age)passpassxiaoming = People('小明',20)
1.8.Self(当前对象的引用)
实例化后,python解释器会把当前对象自动传递给self
1.9.魔术方法
__str__
打印时调用的方法
class People :def __init__(self,name,age):self.name = nameself.age = agepassdef __str__(self):return '姓名:%s 年龄:%d'%(self.name,self.age)passpassxiaoming = People('小明',20)
print(xiaoming)
__new__
创建对象实例的方法,调用一次就会生成新的对象cls(class)cls自动提供
真正创建实例的方法,经常单例模式使用,必须返回实例
class People :def __init__(self,name,age):self.name = nameself.age = ageprint('__init__')passdef __new__(cls, *args, **kwargs):print('__new__')return object.__new__(cls)passpassxiaoming = People('小明',20)
- 区别
__new __
和__init__
__new __
类的实例化方法必须要返回该实例否则对象就创建不成功__init__
用来做数据属性的初始化工作也可以认为是实例的构造方法接受类的实例self并对其进行构造__new __
至少有一个参数是cls代表要实例化的类,此参数在实例化时由python解释器自动提供__new __
函数执行要是于__init__
函数
1.9.1.魔术方法介绍大全
魔术方法介绍大全
2.方法、继承、多态
2.1.析构方法__del__
当一个对象被删除或者被销毁时,python解释器也会默认调用一个方法,这个方法为__del__ ()
方
法,也称为析构方法
2.1.1.释放对象时调用
class People :def __init__(self,name,hp):self.name = nameself.hp = hppassdef __del__(self):print('销毁了')passpassxiaohong = People('xiaohong',100)
2.1.2.手动清空对象
del xiaohong
2.2.继承
2.2.1.单继承
class Animal :def eat(self):print('吃')passpassclass Dog(Animal) :def wwj(self):print('汪汪叫')passpass
2.2.2.多继承
class Animal :def eat(self):print('吃')passpassclass God:def fly(self):print('飞')passpassclass Wukong(Animal,God):def Dayaoguai(self):print('打妖怪')passpass
- 多继承,同名方法查找父类,如没有则向父类的父类查找(广度优先)
__mro__
方法解析顺序,用来了解继承顺序
2.2.3.重写父类方法
class Animal :def eat(self):print('吃')passpassclass Dog(Animal) :def eat(self):print('大口吃')passpass
2.2.4.重写__init__
方法
class People :def __init__(self,name,hp):self.name = nameself.hp = hpprint('调用People__init__')passpassclass Man(People):def __init__(self,name,hp):People.__init__(self,name,hp)#调用父类方法1#super().__init__(name,hp)#调用父类方法2,可在父类逐个查找print('调用Man__init__')passpassman = Man('xxx',100)
2.2.4多态
继承并扩展父类代码,不需要修改父类代码
class Animal :def eat(self):print('吃')passpassclass Dog(Animal) :def eat(self):print('大口吃')passpassclass Cat(Animal) :def eat(self):print('小口吃')passpassdef commonInvoke(obj) :obj.eat()listObj = [Animal(),Cat(),Dog()]for item in listObj :commonInvoke(item)
2.3类属性和实例属性区别
实例对象不可以修改类属性,类属性所有权归类所有
2.4类方法和实例方法和静态方法
1.类方法的第一个参数是类对象cls,通过cls引用的类对象的属性和方法
2.实例方法的第一个参数是实例对象self,通过self引用的可能是类属性、也有可能是实例属
性(这个需要具防分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先
级更高。
3.静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类对象来引
用。
3.封装与单例
3.1.封装
- 属性私有化,无法外部访问,不能被继承,只能内部类使用
class Person :__age = 20 #类属性私有化def __init__(self):self.__name = '小明'#实例属性私有化passpass
- 方法私有化,无法外部访问,不能被继承,只能内部类使用
class Person :def __run(self): #实例方法私有化print('跑')passpass
- 下划线类型
下划线 | 说明 |
---|---|
_xxx
|
protected类型(只允许本身和子类访问) |
__xxx
|
private类型(只允许本身访问) |
__xxx__
|
魔术方法,Python内置方法 |
xxx_
|
避免属性名与python关键字冲突 |
property(属性函数)
类属性的方式实现
class Person :def __init__(self):self.__name = '小明'passdef get_name(self):return self.__namedef set_name(self,name):if name < 0:print('no')else :self.__name = namepassname = property(get_name, set_name)
pass
person = Person()
print(person.name)#访问类属性name
- 装饰器方式实现
class Person :def __init__(self):self.__name = '小明'pass@property #添加装饰器 添加属性标志def name(self):return self.__name@name.setter #提供一个setter方法def name(self,name):if name == '小明':print('no')else :self.__name = namepass
pass
person = Person()
person.name = '小红'
print(person.name)#访问类属性name
__new__
实例化方法
class Person :def __init__(self):self.__name = '小明'passdef __new__(cls, *args, **kwargs):return super().__new__(cls, *args, **kwargs)passpass
3.2.单例模式
不能使用自身new方法,会产生深度递归
class Person :__instance = Nonedef __new__(cls, *args, **kwargs):if not hasattr(cls,'_instance') :cls.__instance = super().__new__(cls, *args, **kwargs)return cls.__instancepasspass
3.3.异常处理
try#可能出现错误的代码块
except:#出错之后执行的代码块
else:#没有出错的代码块
finally:#不管出没出错都会执行的代码块
根据错误类型来捕获的(NameError 、IndexError …)
自上而下依次判断
try :print(b)li = [1,2,3,4]print(li[100])
except NameError as msg:print('出错')print(msg)
except IndexError as msg:print('出错')print(msg)
except Exception as msg:#所有异常print('出错')print(msg)
3.3.1.异常类型
当前函数没找到,则向上层一层层传递查找
异常 | 导致的错误 |
---|---|
AssertionError | 当assert语句失败时引发。 |
AttributeError | 当 属性分配或引用失败时引发。 |
EOFError | 当input()函数达到文件结束条件时引发。 |
FloatingPointError | 当浮 点运算失败时引发。 |
GeneratorExit | 调用 生成器的close()方法时引发。 |
ImportError | 找不到导入的模块时引发。 |
IndexError | 当序 列的索引超出范围时引发。 |
KeyError | 在字典中找不到键时引发。 |
KeyboardInterrupt | 当用户 按下中断键(Ctrl+c或delete)时引发。 |
MemoryError | 当操作耗尽内存时引发。 |
NameError | 在局部或全局范围内找不到变量时引发。 |
NotImplementedError | 由抽象方法提出。 |
OSError | 当系统操作导致系统相关错误时引发。 |
Overf lowError | 当算术运算的结果太大而无法表示时引发。 |
ReferenceError | 使用弱引用代理访问垃圾收集的引用时引发。 |
Runt imeError | 当错误不属于任何其他类别时引发。 |
StopIteration | 函数引发,以指示迭代器不再返回任何项。 |
SyntaxError | 遇到语法错误时由解析器引发。 |
Indentat ionError | 当缩进不正确时引发。 |
TabError | 当缩进由不一致的制表符和空格组成时引发。 |
SystemError | 当解释器检测到内部错误时引发。 |
Sys temExit | 由sys. exit()函数引发。 |
TypeError | 将函数或操作应用于类型不正确的对象时引发。 |
UnboundLocalError | 当在函数或方法中引用局部变量,但没有将值绑定到该变量时引发。 |
UnicodeError | 当 发生与unicode相关的编码或解码错误时引发。 |
UnicodeEncodeError | 当编码过程中发生与unicode相关的错误时引发。 |
UnicodeDecodeError | 当解码过程中出现与unicode相关的错误时引发。 |
UnicodeTrans lateError | 翻译过程中发生与unicode相关的错误时引发。 |
ValueError | 当函数得到类型正确但值不正确的参数时引发。 |
ZeroDivisionError | 当除法或模运算的第二个操作数为零时引发。 |
3.3.2.自定义异常类型
class LenException(Exception):def __init__(self,leng):self.len = lengpassdef __str__(self):return '长度超了'passdef name_Test():try :name = '1111111111'if len(name)>5:raise LenException(len(name))else:print(name)passpassexcept LenException as msg:print(msg)
passname_Test()
3.4.动态添加属性和方法
- 动态添加属性
class Student :def __init__(self,name):self.name = namepassdef __str__(self):return '姓名:%s' %(self.name)
student = Student('小明')
student.age = 20 # 动态添加实例属性
Student.age = 20 # 动态添加类属性
print(student)
print(student.age)
- 动态添加实例方法
import types #添加方法的库def runA(self):print(self.name)passclass Student :def __init__(self):self.name = '小明'passpass
stu = Student()
stu.run = types.MethodType(runA , stu)#动态添加实例方法
stu.run()#调用
- 动态添加类方法
@classmethod
def runA(self):print(self.name)passclass Student :name = '小明'pass
Student.run = runA#动态添加实例方法
Student.run()#调用
- 动态添加静态方法
@staticmethod
def runA():print('55555')passclass Student :name = '小明'pass
Student.run = runA#动态添加实例方法
Student.run()#调用
__slots__
属性
来限制该class能添加的属性。
子类不会继承,只有在当前类中有效。
子类声明__slots__
属性才会继承- 限制添加的属性
class Student(object) :__slots__ = ('name','age') # 限制添加的属性,避免存储多余的数据def __str__(self):return '{},{}' .format(self.name,self.age)passpassstu = Student()
stu.name = '1'
stu.age = 20
stu.high = 20 # 添加不了报错了
print(stu)
print(stu.__dict__)#所有可以用的属性都在这里,占空间大
print(stu.__slots__ )#存储限制添加的属性,避免存储多余的数据
__call__
属性
class Student(object) :def __call__(self, *args, **kwargs):print('1111')passstu = Student()
stu()
【Python】学习笔记总结2(Python面向对象)相关推荐
- Python学习笔记:使用Python操作数据库
Python学习笔记:使用Python操作数据库 一.数据库编程接口 为了对数据库进行统一的操作,大多数语言都提供了简单的.标准化的数据库接口(API).在Python Database API 2. ...
- Python学习笔记:用Python获取数据(本地数据与网络数据)
Python学习笔记:用Python获取数据(本地数据与网络数据) 一.用Python获取本地数据 读写文件(三种基本模式:r, w, a) 1.写文件 2.读文件
- python学习笔记26(python中__name__的使用)
python学习笔记26(python中__name__的使用) 在python中,每个py文件都是一个模块,也都是一个可执行文件,即包含main方法.因此,对每个py文件,可以单独运行,也可以imp ...
- python学习笔记1之-python简介及其环境安装
python学习笔记之-python简介及其环境安装 最近几年python之火不用多说,最近开始利用时间自学python,在学习的过程中,按照自己的思路和理解记录下学习的过程,并分享出来,如果正好你也 ...
- python面向对象编程72讲_2020-07-22 Python学习笔记27类和面向对象编程
一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习. 声明:本人学习是在扇贝编程通过网络学习的,相关的知识.案例来源于扇贝编程.如果使用请说明来源. 第27关 类与面向对 ...
- 【Python学习笔记】1.Python简介
本系列为自己学习Python的笔记,如有误,欢迎大家指正. Python介绍 简介 Python是一种解释型.面向对象的语言.由吉多-范罗苏姆(Guido van Rossum)于1989年发明,19 ...
- Python学习笔记2-搭建Python开发环境
1 Python开发环境概述 所谓"工欲善其事,必先利其器".在正式学习Python开发前,需要先搭建Python开发环境.Python是跨平台的开发工具,可以在多个操作系统上进 ...
- PYTHON学习笔记(六)-- 面向对象
1.面向对象编程–oop(object oriented programming) 面向过程–思考问题时,首先分析怎么按照步骤实现,然后将问题拆解成若干步骤,并一步步完成功能–怎么做 面向对象–关注的 ...
- Python学习笔记:开始Python编程
随着人工智能以及大数据的火热,Python这门语言也被推上了前台,越来越受大家的青睐.受不住诱惑,我也开始努力学习这门语言.边学习,边整理自学笔记,与大家分享,也接受大家的监督,让自已能够坚持下去,熟 ...
- Python学习笔记1-初识Python及Python环境搭建
Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k.相对于 Python 的早期版本,这是一个较大的升级.为了不带入过多的累赘,Python 3.0 在设计的时候没有考 ...
最新文章
- Shodan搜索引擎开始披露恶意软件控制服务器
- linux下安装oracle客户端,实现远程连接oracle库,导出数据表
- 数据库常用语句(日常填充)
- 关于安装torch、torchvision包的问题
- HBase 与Hive数据交互整合过程详解
- 如何管理和记录 SSIS 各个 Task 的开始执行时间和结束时间以及 Task 中添加|删除|修改的记录数...
- 软件测试作业3:软件测试的16条公理
- HarmonyOS之搭建和配置开发环境的流程
- ADF BC:创建绑定到业务组件的UI表
- 水晶底是什么材质_蓝宝石水晶镜面,贵是有道理的!
- FPGA_EP2C8T144_SCH(PDF)
- 计算机丢失vcomp110.dll,msvcp110.dll丢失一键修复工具
- js实现跟浏览器 ctrl+f 一样的效果
- 五款优秀的端口扫描工具
- 瞎聊高速公路与主干道的立交匝道设计
- 加州戴维斯分校计算机专业排名,加州大学戴维斯分校的计算机专业如何?
- 端口汇聚实现多端口带宽叠加
- perf工具简介+火焰图制作与解读
- Python2与Python3的区别(二):raw_input与input
- 2009年5月30日
热门文章
- Transformer性能被高估?DeepMind动态评估模型的时间泛化能力
- AI 时代,如何布局算力基础设施
- 备战秋招 |《百面机器学习》算法+leetcode开班报名!
- 第四期 | 带学斯坦福CS224n自然语言处理课+带打全球Kaggle比赛(文末重金招募老师!)...
- 岗位推荐 | 微软小冰团队招聘数据挖掘/算法工程师实习生
- ACM公选课第八节DP基础3 2020.4.23-5.10补
- IDEA发布运行web项目(曾经遇到的项目启动报404)
- 安卓点击图片跳转界面_安卓手机APP控制无线开关的电路方案设计(原理图+源码)...
- shell 工具_shell 脚本加密工具 - shc
- Spring Boot-场景启动器