面向对象高级

一、多态

例如:水有固态、气态、液态三种形态

多态就是,多个不同类对象可以响应同一个方法,产生不同的结果。多态不是一种特殊的语法,而是一种状态,特性。即多个不同的对象可以响应同一个方法,产生不同的结果也就是多个对象有相同的方法

好处:对于使用使用者而言。大大的降低了使用难度

二、实现多态

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

案例:要管理 鸡 鸭 鹅如何能够最方便的管理,就是我说同一句话,他们都能理解既它们拥有相同的方法

 1 class Chicken:
 2     def bark(self):
 3         print('咕咕咕')
 4 
 5     def spawn(self):
 6         print('下鸡蛋')
 7 
 8 class Duck:
 9     def bark(self):
10         print('嘎嘎嘎')
11 
12     def spawn(self):
13         print('下鸭蛋')
14 
15 class E:
16     def bark(self):
17         print('鹅鹅鹅')
18 
19     def spawn(self):
20         print('下鹅蛋')
21 
22 
23 def manage(obj):
24     obj.spawn()
25 
26 a = Chicken()
27 b = Duck()
28 c = E()
29 
30 manage(a)
31 manage(b)
32 manage(c)
View Code

python中到处都有多态!

三、OOP相关的内置函数

1.isinstance

检查是否obj是否是类 cls 的对象

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

2.issubclass

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

参数一是子类,参数二是父类

class Animal:
    def eat(self):
        pass


class Pig(Animal):
    def eat(self):
        print('猪吃猪饲料')

class Tree():
    def life(self):
        print('树要进行光合作用')

def manage(obj):
    if issubclass(type(obj),Animal):
        obj.eat()
    else:
        print('不是动物!')

p = Pig()
t = Tree()
manage(p)
manage(t)
View Code

3.str

__str__会在对象被转换为字符串时,转换的结果就是这个函数的返回值,使用场景:我可以利用该函数来自定义,打印格式。

 1 class Person:
 2     def __init__(self,name,age):
 3         self.name = name
 4         self.age = age
 5 
 6     def __str__(self):
 7         return '这是一个person对象,name:%s,age:%s'%(self.name,self.age)
 8 
 9 p = Person('jack','20')
10 print(p)
View Code

4.del

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

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

 1 class FileTool:
 2     def __init__(self,path):
 3         self.file = open(path,'rt',encoding='utf-8')
 4 
 5     def read(self):
 6         return self.file.read()
 7 
 8     def __del__(self):
 9         self.file.close()
10 
11 f = FileTool('test.txt')
12 
13 print(f.read())
View Code

5.call

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

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

6.slots

优化内存,限制属性

1 class Person:
2     __slots__ = ['name']
3     def __init__(self,name,age):
4         self.name = name
5       
6 p = Person('zzj',18)
View Code

7.__setattr__、__delattr__、__getattr__、__getattribute__

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

setattr 用点设置属性

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

getattribute该函数也是用来获取属性的,在获取属性时如果存在getattribute则先执行该函数,如果没有拿到属性则继续调用getattr函数,如果拿到了则直接返回

 1 class A:
 2 
 3     def __setattr__(self, key, value):
 4         print('__setattr__')
 5         self.__dict__[key] = value
 6 
 7     def __delattr__(self, item):
 8         print('__delattr__')
 9         self.__dict__.pop(item)
10 
11     def __getattr__(self, item):
12         print('__getattr__')
13         return self.__dict__[item]
14 
15     def __getattribute__(self, item):
16         print('__getattribute__')
17         return super().__getattribute__(item)
18 
19 
20 a = A()
21 a.name = 'jason'
22 print(a.name)
View Code

8.[]的实现原理

getitem setitem delitem

任何的符号都会被解释器解释成特殊含义,例如:. [] ()

getitem 当你用中括号去获取属性时执行

setitem 当你用中括号去设置属性时执行

delitem 当你用中括号去删除属性时执行

 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         print('__delitem__')
12         del self.__dict__[key]
13 
14 a = A()
15 a['name'] = 'jerry'
16 print(a['name'])
17 del a['name']
View Code

9.运算符重载

当我们在使用某个符号时,python解释器都会为这个符号定义一个含义,同时调用对应的处理函数,当我们需要自定义对象的比较规则时,就可在子类中覆盖大于、等于一系列方法。

 1 class Student:
 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         return self.height > other.height
 9 
10     def __lt__(self, other):
11         return self.height < other.height
12 
13     def __eq__(self, other):
14         return self.height == other.height
15 stu1 = Student('zzj',180,18)
16 stu2 = Student('lzx',150,30)
17 
18 print(stu1 > stu2)
19 print(stu1 < stu2)
20 print(stu1 == stu2)
View Code

上述代码中,other指的是另一个参与比较的对象

大于和小于只要实现一个即可,符号如果不同,解释器会自动交换两个对象的位置

10.迭代器协议

迭代器是指具有__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 for i in range(1,10,2):
19     print(i)
View Code

11.上下文管理

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

在python中,上下文可以理解为是一个代码区间,一个范围,例如:with,open打开的文件仅在这个上下文中有效

涉及到的两个方法:

enter:表示进入上下文,(进入某个场景了)

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

当执行with语句时,会先执行enter,当代码执行完毕之后执行exit,或者代码遇到了异常会立即执行exit,并传入错误信息,包含错误的类型、错误的信息、错误的追踪信息

 1 class MyOpen:
 2     def __init__(self,path):
 3         self.path = path
 4 
 5     def __enter__(self):
 6         self.file = open(self.path)
 7         return self
 8 
 9     def __exit__(self, exc_type, exc_val, exc_tb):
10         self.file.close()
11 
12 with MyOpen('test.txt') as f:
13     print(f.file.read())
View Code

  enter函数应该返回对象自己

  exit函数 可以有返回值,是一个bool类型

  如果为True,则意味着,异常已经被处理了

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

 

 

posted @ 2019-07-29 19:50  朱朱朱朱朱  阅读(134)  评论(0编辑  收藏  举报