面向对象 高级篇

今日内容

1. 多态

2. 一些内置函数

3. 运算符重载

4. 迭代器协议

5. 上下文管理

一 多态:
多态的概念:
  一种事物具备多种形态

  列如: 水有  固态 气态  液态

     大黄蜂:汽车人 汽车 飞机

官方解释:

  多个不同类对象可以响应同一个方法,产生不同的结果

  但是要强调的是多态不是一种特殊的语法,而是一种状态,特性(即多个不同对象可以响应同一个方法,产生不同的结果,就是多个对象

  有相同的方法)

好处:

  对于使用者而言,大大降低了使用难度

  比如说写的USB接口下的鼠标,键盘,就属于多态

那如何实现多态

比如说接口,抽象类,鸭子类型,都可以写出具备多态的代码,最简单的就是鸭子类型

案例:

 1 """
 2 要管理 鸡 鸭 鹅
 3 如何能够最方便的 管理,就是我说同一句话,他们都能理解
 4 既它们拥有相同的方法
 5 
 6 """
 7 class JI:
 8     def bark(self):
 9         print("哥哥哥")
10 
11     def spawn(self):
12         print("下鸡蛋..")
13 
14 class Duck:
15     def bark(self):
16         print("嘎嘎嘎")
17 
18     def spawn(self):
19         print("下鸭蛋")
20 
21 class E:
22     def bark(self):
23         print("饿饿饿....")
24 
25     def spawn(self):
26         print("下鹅蛋..")
27 
28 j = JI()
29 y = Duck()
30 e = E()
31 
32 def mange(obj):
33     obj.spawn()
34 
35 
36 mange(j)
37 mange(y)
38 mange(e)
39 
40 
41 # python中到处都有多态  
42 a = 10
43 b = "10"
44 c = [10]
45 
46 print(type(a))
47 print(type(b))
48 print(type(c))
View Code

二 内置函数 

1. isinstance

判断一个对象是否是某个类的实例

参数一 要判断的对象

参数二 要判断的类型

案例:

1 def add_num(a,b):
2 
3     if isinstance(a,int) and isinstance(b,int):
4         return a+b
5     return None
6 
7 print(add_num(20,10))
View Code

2. issubclass

判断一个类是否是另一个类的子类

参数一是子类

参数二是父类

案例:

 1 class Animal:
 2 
 3     def eat(self):
 4         print("动物得吃东西...")
 5 
 6 class Pig(Animal):
 7     def  eat(self):
 8         print("猪得吃 猪食....")
 9 
10 
11 class Tree:
12     def light(self):
13         print("植物光合作用....")
14 
15 pig = Pig()
16 t = Tree()
17 #
18 def manage(obj):
19     if issubclass(type(obj),Pig):
20         obj.eat()
21     else:
22         print("不是一头动物!")
23 
24 
25 
26 manage(pig)
27 
28 # manage(t)
29 
30 # print(issubclass(Tree,object))
View Code

3. str

__str__ 会在对象被转换为字符串时,转换的结果就是这个函数的返回值

使用场景:我们可以利用该函数来自定义,对象的是打印格式

案例:

 1 import time
 2 
 3 
 4 class  Person:
 5 
 6     def __init__(self,name,age):
 7         self.name = name
 8         self.age = age
 9 
10     # def __str__(self):
11     #
12     #     return "这是一个person对象 name:%s age:%s" % (self.name,self.age)
13     # pass
14 
15     def __del__(self):
16         print("del run")
17 
18 
19 
20 p = Person("jack",20)
21 
22 # del p
23 
24 time.sleep(2)
25 # str(p)
26 print("over")
View Code

4. del

执行时机:手动删除对象时立马执行,或者是程序运行结束时也会自动执行

使用场景:当你的对象在使用过程中,打开了不属于解释器的资源:列如文件,网络端口

案例:

 1 class FileTool:
 2     """该类用于简化文件的读写操作 """
 3 
 4     def __init__(self,path):
 5         self.file = open(path,"rt",encoding="utf-8")
 6         self.a = 100
 7 
 8     def read(self):
 9         return self.file.read()
10 
11     # 在这里可以确定一个事,这个对象肯定不使用了 所以可以放心的关闭问文件了
12     def __del__(self):
13         self.file.close()
14 
15 
16 tool = FileTool("a.txt")
17 print(tool.read())
View Code

5.call

执行时机:在调用对象时自动执行,(即对象加括号)

案例:

1 class A:
2 
3     def __call__(self, *args, **kwargs):
4         print("call run")
5         print(args)
6         print(kwargs)
7 
8 a = A()
9 a(1,a=100)
View Code

6. slots

该属性是一个类属性,用于优化对象内存占用

优化的原理,将原本不固定的属性数量,变得固定了

这样的解释器就不会为这个对象创建名称空间了,所以__dict__也没了

从而达到减少了内存开销的效果

另外当类中出现了slots时将导致这个类的对象无法添加新的属性

案例:

 1 class Person:
 2 
 3     __slots__ = ["name"]
 4     def __init__(self,name):
 5         self.name = name
 6 
 7 p =  Person("jck")
 8 
 9 # 查看内存占用
10 # print(sys.getsizeof(p))
11 # p.age = 20 # 无法添加
12 
13 # dict 没有了
14 print(p.__dict__)
View Code

7.属性getattr setattr delattr

getattr 用点访问属性的式如果属性不存在时执行

setattr 用点设置属性时

delattr 用del 对象 . 属性 删除属性时 执行

这几个函数反映了   Python解释器是如何实现 用点来访问属性‘

getattribute 该函数也是用来获取属性

在获取属性时如果存在getattribute则先执行该函数,如果没有拿到属性则继续调用getattr函数

如果拿到了则直接返回

案例:

 1 class A:
 2     def __getitem__(self, item):
 3         print("__getitem__")
 4         return self.__dict__[item]
 5 
 6     def __setitem__(self, key, value):
 7         print("__setitem__")
 8         self.__dict__[key] = value
 9 
10     def __delitem__(self, key):
11         del self.__dict__[key]
12         print("__delitem__")
13 
14 
15 a = A()
16 # a.name = "jack"
17 a["name"] = "jack"
18 print(a["name"])
19 del a["name"]
20 print(a["name"])
View Code

三 运算符重载

当我们在使用某个符号时,Python解释器都会为这个符号定义一个含义,

同时调用对应的处理函数,当我们需要自定义对象的比较规则时,就可以

在子类中覆盖 大于 等于 等一系列方法

案例:

原本自定义对象无法直接使用大于小于来进行比较,我们可自定义运算符来实现,让自定义对象也支持比较运算符

 1 class Student(object):
 2     def __init__(self,name,height,age):
 3         self.name = name
 4         self.height = height
 5         self.age = age
 6 
 7     def __gt__(self, other):
 8         # print(self)
 9         # print(other)
10         # print("__gt__")
11         return self.height > other.height
12     
13     def __lt__(self, other):
14         return self.height < other.height
15 
16     def __eq__(self, other):
17         if self.name == other.name and  self.age == other.age and self.height == other.height:
18             return True
19         return False
20 
21 stu1 = Student("jack",180,28)
22 stu2 = Student("jack",180,28)
23 # print(stu1 < stu2)
24 print(stu1 == stu2)
View Code

四 迭代器协议

迭代器是指具有__iter__ ,__next__对象

我们可以为对象增加这俩个方法来让对象变成一个迭代器

案例:

 1 class MyRange:
 2 
 3     def __init__(self,start,end,step):
 4         self.start = start
 5         self.end = end
 6         self.step = step
 7 
 8     def __iter__(self):
 9         return self
10 
11     def __next__(self):
12         a = self.start
13         self.start += self.step
14         if a < self.end:
15             return a
16         else:
17             raise StopIteration
18             
19 for i in MyRange(1,10,2):
20     print(i)
View Code

五 上下文管理

上下文context

这个概念属于语言学科,指的是一段话的意义,要参考当前的场景,即上下文

在Python中,上下文可以理解为是一个代码区间,一个范围,列如with open 

打开的文件仅在这个上下文中有校

涉及到的俩个方法:
  enter:表示进入上下文(进入某个场景了)

  exit:表示退出上下文(退出某个场景了)

当执行with 语句时,会先执行enter,

当代码执行完毕后执行exit,或者代码遇到了异常会立即执行exit,并传入错误信息

包含错误的类型,错误的信息,错误的追踪信息

注意:
enter 函数应该返回对象自己

exit 函数 ,可以返回值,是一个bool类型,用于表示异常是否被处理,

仅在上下文中出现异常有用

若果为True 则意味着,异常以及被处理了

False,异常未被处理,程序中断报错

案例:

 1 class MyOpen(object):
 2 
 3 
 4     def __init__(self,path):
 5         self.path = path
 6 
 7     def __enter__(self):
 8         self.file = open(self.path)
 9         print("enter.....")
10         return self
11 
12     def __exit__(self, exc_type, exc_val, exc_tb):
13         print("exit...")
14         # print(exc_type,exc_val,exc_tb)
15         self.file.close()
16         return True
17 
18 
19 with MyOpen("a.txt") as m:
20     # print(m)
21     # print(m.file.read())
22     "123"+1
23 
24 # m.file.read()
View Code

  

    

 

原文地址:https://www.cnblogs.com/zahngyu/p/11264356.html