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. 项目管理工具Maven的简单配置示例

    Maven是一个强大的项目管理工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建.报告和文档.以下是一些关于Maven的具体例子,涵盖了项目配置.依赖管理.插件使用等方面: ...

  2. 我们常用的地铁卡/银行卡,竟然运行着一个 Java 虚拟机

    我们日常使用 NFC 卡可以用来刷地铁,进出门禁,但是你有没有想过, 当我们使用一个 NFC 的 IC 卡刷卡进入地铁的时候,此时系统是如何知道我这个卡上有多少充值余额的? 这个薄薄的 NFC 卡到底 ...

  3. SMU Summer 2023 Contest Round 12

    SMU Summer 2023 Contest Round 12 A. K-divisible Sum 分类讨论: \(n > k\)时: \(n\)能整除\(k\)就全是\(1\) 不能整除, ...

  4. 微服务全链路跟踪:jaeger集成istio,并兼容uber-trace-id与b3 荐

    微服务全链路跟踪:grpc集成zipkin 微服务全链路跟踪:grpc集成jaeger 微服务全链路跟踪:springcloud集成jaeger 微服务全链路跟踪:jaeger集成istio,并兼容u ...

  5. Typora中的markdown语法的学习

    markdown语法学习 二级标题 三级标题 四级标题 字体 hello world hello world hello world hello world 引用 我是最nb的 分割线 图片 ctrl ...

  6. MSI Afterburner 使用

    MSI Afterburner 是一款显卡超频软件,同时可以监测硬件运行数据(CPU 温度.GPU 温度.帧率.帧生成时间等).与其捆绑安装的 RivaTuner Statistics Server ...

  7. VMware Workstation Pro 开启虚拟化引擎

    摘要:想开启 VMware Workstation Pro 虚拟机上的 虚拟化 Intel VT-x/EPT 或 AMD-V/RVI 选项,却发现打不开.在网上一番搜集之后找到了解决办法. ️ 注意: ...

  8. 【Jenkins】之自动化测试持续集成

    一.创建jenkins项目 选择节点 创建指定名称的目录名: 写命令,执行shell: 命令填写: # 引入电脑配置文件 #. ~/.bash_profile cd Python_Interface ...

  9. FirewallD, iptables, Docker

    firewalld 是之前 iptables 的前端.命令更好用 FirewallD 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件 ...

  10. freebsd 上硬盘操作

    列出硬盘 # egrep 'ad[0-9]|cd[0-9]' /var/run/dmesg.boot or # geom disk list or # camcontrol devlist 查看cac ...