1、类的语法

# 类的语法

# 定义类
class Dog(object): # 类的属性或者类变量,一般是公共属性,存在类的内存空间,所有实例对象共享
d_type = "京巴" #初始化方法, 构造方法,实例化类的时候进行的初始化操作,这里定义的变量要实例属性
def __init__(self,name: str,age: int,):
print("初始化方法",name,age) # 实例方法
def sayhi(self):
print("hello my name is dog,my type is {dt}".format(dt = self.d_type)) # 实例化类,生成类的对象
d1 = Dog("d1",2)
d2 = Dog("d2",3) print(d1.d_type,id(d1.d_type))
print(d2.d_type,id(d2.d_type)) Dog.d_type = "藏獒"
print(d1.d_type,id(d1.d_type))
print(d2.d_type,id(d2.d_type)) d1.sayhi() d2.sayhi()

2、实例方法的self到底是什么?

# 类的语法

# 定义类
class Dog(object):
# 类的属性或者类变量,一般是公共属性,存在类的内存空间,所有实例对象共享该内存空间
d_type = "京巴" # 构造方法,实例化类的时候进行的初始化操作,这里的变量存在于对象的内存空间中,对象之间是隔离的
def __init__(self,name: str,age: int):
self.name = name
self.age = age # 实例方法
def sayhi(self):
print("hello my name is dog,my type is {dt}".format(dt=self.d_type))
print("我的名字是{name},我的年龄是{age}".format(name = self.name,age = str(self.age)))
print(self) #我们通过打印的数值就知道self其实就是对象本身 d1 = Dog("name1",1)
d2 = Dog("name2",2) d1.sayhi()
d2.sayhi() print(d1)

3、类的属性

class Dog(object):
# 类的属性或者类变量,一般是公共属性,存在类的内存空间,所有实例对象共享该内存空间
d_type = "京巴" # 构造方法,实例化类的时候进行的初始化操作,这里的变量存在于对象的内存空间中,对象之间是隔离的
def __init__(self,name: str,age: int):
self.name = name
self.age = age d1 = Dog("d1",2)
d2 = Dog("d2",2)
# 两种方式可以调用类的属性,通过类和实例都可以调用 print(Dog.d_type)
print(d1.d_type)
d1.d_type = "藏獒" print(d1.d_type) #相当于创建了一个实例变量
print(Dog.d_type) #当然不会影响这一部步骤的结果输出
print(d2.d_type) #当然不会影响这一步骤的结果输出,d2还是打印的类的属性的值 # 实例属性只能通过实例来调用
print(d1.age) # 类不能调用实例属性
# print(Dog.name)
# 会抛错

4、类的继承

# 继承

class Animal(object):
def __init__(self,name,age):
self.name = name
self.age = age def eate(self):
print("eating") class Persion(Animal): def __init__(self,name,age,address):
Animal.__init__(self,name,age) #执行父类的构造方法
self.address = address #执行子类的构造方法 # 子类可以自定义自己的方法,这个方法只能被这个子类和这个子类的子类实例调用
def talk(self):
print("talking") # 子类当然可以重新父类的方法,子类如果调用eate方法,则优先调用自己重新的eate方法
def eate(self):
print("人在慢慢的吃饭") class Dog(Animal): def killrabbit(self):
print("killrabbit") p1 = Persion("P1",23,"深圳") p1.eate()
p1.talk() d1 = Dog("d1",23)
d1.eate()
d1.killrabbit()

  

5、类的多继承

# 多继承

class Shenxian():
def __init__(self,name):
self.name = name
print("Shenxian的构造方法") def fly(self):
print("Shenxian,fly") def talk(self):
print("shenxian talk") class Monkey():
def __init__(self,name,high):
self.name = name
self.high = high
print("monkey的构造方法") def Monkey(self):
print("Monkey,Monkey") def talk(self):
print("Monkey talk") class King(Shenxian,Monkey):
def __init__(self,name,high,age):
Shenxian.__init__(self,name)
Monkey.__init__(self,name,high) self.age = age k1 = King("k1","dd","33") k1.talk() # 多继承的继承顺序 # 按顺序从左到右继承
# 广度优先(python2是深度优先)

6、类的封装

# 封装

# 防止该类的代码和变量被外部随意访问

class Persion(object):
def __init__(self,name):
self.name = name self.__life = 100 #变量前面加2个下划线,外面就不能直接访问了,但是内部可以使用 def getlife(self): #可以通过方法来返回私有属性,让外部获取私有属性的值,但是不能修改
return self.__life def __attck(self): #私有方法外部也不能访问
self.__life = self.__life - 10 def bite(self):
print(self.__life) p1 = Persion("name") # 如果外部想访问的话 可以这样搞
#
# 实例名._类名__方法名 r = p1._Persion__life
print(r)

7、类的多态

# 多态

# 一个对象会有多种表现形式,多个对象共用一个接口,又表现出不一样的形态

class Dog():
def sound(self):
print("汪汪汪") class Cat():
def sound(self):
print("喵喵喵") def make_sound(obj):
obj.sound() d1 = Dog()
c1 = Cat() # 同一个接口,不同的表现形式 make_sound(d1)
make_sound(c1)

8、classmethod装饰器

class Dog(object):
def __init__(self):
pass @classmethod
#通过classmethod装饰器实现,被classmethod装饰后的方法称为类方法,类方法和普通方法
# 的区别在于类方法只能访问类变量,不能访问实例变量
def test(self):
#这个self其实是类本身,而不是具体的实例,我们通过打印可以知道
print(self) d = Dog()
d.test()
# <class '__main__.Dog'> print(Dog)
# <class '__main__.Dog'>

9、staticmethod装饰器

class Dog(object):
name = 1
def __init__(self):
pass
#通过staticmethod装饰器实现,被staticmethod装饰后的方法称为静态方法,静态方法和普通方法
# 的区别在于静态方法不能访问类的属性,也不能实例的属性 # 静态方法隔离了静态方法和类和实例的任何方法和属性 @staticmethod
def test():
print("123",Dog.name) d = Dog() d.test()

10、propty装饰器

class Dog(object):
name = 1
def __init__(self):
pass # property把一个方法变成一个静态的属性 @property
def test(self):
if Dog.name == 1:
print("123",Dog.name)
else:
print("456", Dog.name) @test.setter
def test(self,status):
pass @test.deleter
def test(self):
pass d1 = Dog() d1.test d2 = Dog()
Dog.name = 2
d2.test
# 被property装饰的方法只能这样当作一个变量去执行,不需要加括号,如果一个变量的值比较负责,有一些列的逻辑
# 被property装饰的方法只能这样当作一个变量去执行,虽然看起来是个变量,但是实际是不能赋值的 # d2.test = 2
# AttributeError: can't set attribute # 如果想对一个方法做赋值,在需要使用 下面的方法
# 通过也可以实现删除 # 通过property把一个方法变成属性,通过@test.setter方法可以对test这个方法的进行赋值,通过@test.deleter
# 方法可以对test这个属性进行删除,此处的函数名称必须是一样的 @property
def test(self):
if Dog.name == 1:
print("123", Dog.name)
else:
print("456", Dog.name) @test.setter
def test(self, status):
pass @test.deleter
def test(self):
pass

11、反射

# 反射:可以通过字符串的形式来操作一个对象的属性

class Dog(object):
name = 1
def __init__(self,age,add):
self.age = age
self.add = add def test(self):
pass d = Dog(1,"深圳") # hasattr 用于判断对象d是否有name这个属性
r1 = hasattr(d,"name") r2 = hasattr(d,"age") r3 = hasattr(d,"2b") r4 = hasattr(d,"test") print(r1,r2,r3,r4) # getattr()用于获取对象d的name属性的值 print(getattr(d,"name")) # setattr() 对对象的属性进行赋值 setattr(d,"age",3) print(getattr(d,"age")) # delattr 对对象的属性进行删除 delattr(d,"age") print(hasattr(d,'age'))

12、动态加载模块

# 动态加载模块,热加载

import importlib

try:
obj = importlib.import_module("test5")
except ModuleNotFoundError as e:
print(e) # 通过字符串的方式导入模块

13、类的双下划线方法

# 类的双下划线方法

class Dog(object):
def __init__(self,name):
self.name = name
def __len__(self):
print("执行len方法")
return 1 def __hash__(self):
print("执行hash方法")
return 1 def __eq__(self, other):
print("执行==方法")
return False # 通过字典的方式获取值
def __getitem__(self, item):
print("执行d[key]")
return "__getitem__" def __setitem__(self, key, value):
print("执行d[key] = value")
self.key = value def __delitem__(self, key):
print("执行del d[key]") def __delattr__(self, item):
print("执行del d.item的时候执行") def __str__(self):
print("执行str(d1)的方法时候执行,或者直接打印对象的时候执行") def __del__(self):
print(self.name,"对象销毁的时候执行,python的对象会自动化销毁的") def __call__(self, *args, **kwargs):
print("对象后加括号执行的方法") d1 = Dog("d1")
d2 = Dog("d2")
print(len(d1))
#就会执行实例的__len__方法 print(hash(d1))
#就会执行实例的__hash__方法 print(d1 == d2) print(d1["name"]) d1["age"] = 10 print(d1["age"])

14、内置异常

# isinstance()
#
# issubclass()
# 内置异常 try:
pass except ValueError as e:
print("传入一个调用者不期望的值")
except AttributeError as e:
print("试图访问一个对象没有的属性的错误")
except IOError as e:
print("输出输入错误,基本上无法打开文件")
except ImportError as e:
print("无法引入模块或者包")
except IndentationError as e:
print("代码没有正确对齐的错误")
except IndexError as e:
print("下标索引超出边界")
except KeyError as e:
print("试图访问字典中不存在的key值")
except KeyboardInterrupt as e:
print("ctrl + c被按下")
except NameError as e:
print("使用一个还未被赋予值的对象")
except SyntaxError as e:
print("python代码非法,可以认为是语法错误")
except TypeError as e:
print("传入对象和要求对象的类型不一致")
except FileNotFoundError as e:
print("文件不存在错误")
except Exception as e:
print("万能异常,但是只能抓内置的异常类型,自定义的异常这里是抓不到的") else:
print("没有出异常会走到这里") finally:
print("无论发生异常,还是没有发生异常,都要走到finally这里")

15、自定义异常

class MyException(BaseException):
def __init__(self,msg):
self.msg = msg def __str__(self):
return self.msg try:
for i in range(10):
if i == 9:
raise MyException("此时逻辑错误,捕获自定义异常")
else:
print(i)
except MyException as e:
print(e)

16、断言

assert  type(1) is int

assert  1 == 2

assert  1 >= 2

# 断言也可以在函数中assert断言参数的类型是否符合我们的要求

python面向对象复习的更多相关文章

  1. python 面向对象初级篇

    Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...

  2. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  3. python面向对象进阶(八)

    上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  4. python 面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  5. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  6. Python面向对象详解

    Python面向对象的"怜人之处" Python的待客之道--谁能进来 Python的封装--只给你想要的 Python的继承--到处认干爹 Python的多态--说是就是

  7. python 面向对象和类成员和异常处理

    python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...

  8. python 面向对象学习

    ------Python面向对象初 下面写一个类的简单实用,以便方便理解类 #python 3.5环境,解释器在linux需要改变 #阅读手册查询readme文件 #作者:S12-陈金彭 class ...

  9. 初识python面向对象

    一.初识python面向对象: class Person: #使用class关键字定义一个类 age=0 #类变量(静态变量) def eat(self,food): #定义一个方法 self.age ...

  10. python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异

    1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html   1.__init__() 创建对 ...

随机推荐

  1. Golang在整洁架构基础上实现事务

    前言 大家好,这里是白泽,这篇文章在 go-kratos 官方的 layout 项目的整洁架构基础上,实现优雅的数据库事务操作. 视频讲解 :B站:白泽talk,公众号[白泽talk] 本期涉及的学习 ...

  2. vue(element)中使用monaco实现代码高亮

    vue(element)中使用monaco实现代码高亮 使用的是vue语言,用element的组件,要做一个在线编辑代码,要求输入代码内容,可以进行高亮展示,可以切换各不同语言,而且支持关键字补全,还 ...

  3. 横扫鸿蒙弹窗乱象,SmartDialog出世

    前言 但凡用过鸿蒙原生弹窗的小伙伴,就能体会到它们是有多么的难用和奇葩,什么AlertDialog,CustomDialog,SubWindow,bindXxx,只要大家用心去体验,就能发现他们有很多 ...

  4. 免费word简历 简历制作平台

    分享一个简历制作平台. 免费的word模版 链接地址 https://www.xyjianli.com/ https://www.xyjianli.com/list https://www.xyjia ...

  5. PowerShell快速修改多个文件的名称

      本文介绍基于PowerShell语言,对文件夹中全部文件的名称加以批量替换.修改的方法.   在之前的文章中,我们介绍了基于Python语言,批量修改大量文件的名称的方法.当时我们修改文件名的需求 ...

  6. zuul集成apollo动态刷新配置

    zuul集成apollo实现路由配置的动态刷新 import com.ctrip.framework.apollo.model.ConfigChangeEvent; import com.ctrip. ...

  7. 初三年后集训测试 T2--牛吃草

    初三年后集训测试 $T 2 $ 牛吃草 一言难尽 $$HZOI$$ $ Description $ 由于现代化进程的加快,农场的养殖业也趋向机械化. \(QZS\) 决定购置若干台自动喂草机来减少自己 ...

  8. tar 解压文件时提示 Ignoring unknown extended header keyword

    在 Linux 上使用 tar 解压文件时出现下列提示: tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.app ...

  9. SVG Video 声音图标灰色,无法点击

    原因:Video里的视频放的是录屏,怪不得声音图标是灰色的 换成正常有声音的mp4文件,声音图标就正常了

  10. HTB-Runner靶机笔记

    HTB-Runner靶机笔记 概述 Runner是HTB上一个中等难度的Linux靶机,它包含以下teamcity漏洞(CVE-2023-42793)该漏洞允许用户绕过身份验证并提取API令牌.以及d ...