博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象高级
阅读量:5026 次
发布时间:2019-06-12

本文共 5415 字,大约阅读时间需要 18 分钟。

一、多态

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

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

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

二、实现多态

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

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

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 + b4     return None5 print(add_num(10,5))
View Code

2.issubclass

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

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

class Animal:    def eat(self):        passclass 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 = name5       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.height12 13     def __eq__(self, other):14         return self.height == other.height15 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 self10 11     def __next__(self):12         a = self.start13         self.start += self.step14         if a < self.end:15             return a16         else:17             raise StopIteration18 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,异常未被处理,程序将中断报错

 

 

转载于:https://www.cnblogs.com/spencerzhu/p/11266070.html

你可能感兴趣的文章
node.js之express框架
查看>>
布局-两列布局(一列定宽,一列自适应)
查看>>
新手学习java应该注意的事情
查看>>
前端学HTTP之URL
查看>>
.vimrc
查看>>
uva6152Bits Equalizer
查看>>
linux install Openvino
查看>>
struts2中action如何获取jsp页面参数
查看>>
华为机试题
查看>>
Leetcode Delete Node in a Linked List
查看>>
mybatis中二级缓存整合ehcache实现分布式缓存
查看>>
Lucene中的Ram存储
查看>>
document.compatMode
查看>>
do_try_to_free_pages
查看>>
attribute和property的区别
查看>>
python爬取百度搜索图片
查看>>
排序之希尔排序(shell sort)
查看>>
Linux学习之CentOS(二十一)--Linux系统启动详解
查看>>
Hadoop的体系结构之MapReduce的体系结构
查看>>
python学习(四)字符串学习
查看>>