一、isinstance(obj,cls)和issubclass(sub,super)

isinstance(obj,cls)检查obj是否是cls的对象

issubclass(sub,super)检查sub是否是super的派生类

classBar:pass

classFoo(Bar):passobj=Foo()print(isinstance(obj,Foo))#True

print(issubclass(Foo,Bar))#True

二、反射

python面向对象中的反射:通过字符串的形式操作对象相关的属性

通过下面四个函数可以实现,适用于类和对象

hasattr(object,name):判断一个object中有没有name属性或者方法

getatrr(object,name,default=None):获取object中的name属性或方法,设置defult=None时没找到返回None,没设置报错

setattr(x,y,z)修改x中y的值为z,当y不存在时添加y的值为z

delattr(x,y)删除x中的y属性或方法

演示代码:

classBlackMedium:

feature='Ugly'

def __init__(self,name,addr):

self.name=name

self.addr=addrdefsell_house(self):print('%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼' %self.name)defrent_house(self):print('%s 黑中介租房子啦,傻逼才租呢' %self.name)

b1=BlackMedium('万成置地','回龙观天露园')#检测是否含有某属性

print(hasattr(b1,'name'))print(hasattr(b1,'sell_house'))#获取属性

n=getattr(b1,'name')print(n)

func=getattr(b1,'rent_house')

func()#getattr(b1,'aaaaaaaa') #报错

print(getattr(b1,'aaaaaaaa','不存在啊'))#设置属性

setattr(b1,'sb',True)

setattr(b1,'show_name',lambda self:self.name+'sb')print(b1.__dict__)print(b1.show_name(b1))#删除属性

delattr(b1,'addr')

delattr(b1,'show_name')

delattr(b1,'show_name111')#不存在,则报错

print(b1.__dict__)

四个方法的使用演示

View Code

python中一切皆对象,也可以对类使用反射

三、二次加工标准类型(包装)

包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均可以通过下面的方式进行二次加工)

class List(list): #继承list所有的属性,也可以派生出自己新的,比如append和mid

defappend(self, p_object):'派生自己的append:加上类型检查'

if notisinstance(p_object,int):raise TypeError('must be int')

super().append(p_object)

@propertydefmid(self):'新增自己的属性'index=len(self)//2

returnself[index]

l=List([1,2,3,4])print(l)

l.append(5)print(l)#l.append('1111111') #报错,必须为int类型

print(l.mid)#其余的方法都继承list的

l.insert(0,-123)print(l)

l.clear()print(l)

二次加工标准类型(基于继承实现)

授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。

实现授权的关键点就是覆盖__getattr__方法

授权示范代码一

#_*_coding:utf-8_*_

__author__ = 'Linhaifeng'

#我们来加上b模式支持

importtimeclassFileHandle:def __init__(self,filename,mode='r',encoding='utf-8'):if 'b' inmode:

self.file=open(filename,mode)else:

self.file=open(filename,mode,encoding=encoding)

self.filename=filename

self.mode=mode

self.encoding=encodingdefwrite(self,line):if 'b' inself.mode:if notisinstance(line,bytes):raise TypeError('must be bytes')

self.file.write(line)def __getattr__(self, item):returngetattr(self.file,item)def __str__(self):if 'b' inself.mode:

res="<_io.BufferedReader name='%s'>" %self.filenameelse:

res="<_io.TextIOWrapper name='%s' mode='%s' encoding='%s'>" %(self.filename,self.mode,self.encoding)returnres

f1=FileHandle('b.txt','wb')#f1.write('你好啊啊啊啊啊') #自定制的write,不用在进行encode转成二进制去写了,简单,大气

f1.write('你好啊'.encode('utf-8'))print(f1)

f1.close()

授权示范二

授权示范代码二

四、_getattribute_

当__getattribute__与__getattr__同时存在,只会执行__getattrbute__,除非__getattribute__在执行过程中抛出异常AttributeError

classFoo:def __init__(self,x):

self.x=xdef __getattr__(self, item):print('执行的是我')#return self.__dict__[item]

def __getattribute__(self, item):print('不管是否存在,我都会执行')raise AttributeError('哈哈')

f1=Foo(10)

f1.x

f1.xxxxxx

五、_str_,_repr_,_format_

定制对象被打印时的输出信息,必须返回一个字符串类型的值! __str__,__repr__

自定制格式化字符串__format__

format_dict={'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型

'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址

'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名

}classSchool:def __init__(self,name,addr,type):

self.name=name

self.addr=addr

self.type=typedef __repr__(self):return 'School(%s,%s)' %(self.name,self.addr)def __str__(self):return '(%s,%s)' %(self.name,self.addr)def __format__(self, format_spec):#if format_spec

if not format_spec or format_spec not informat_dict:

format_spec='nat'fmt=format_dict[format_spec]return fmt.format(obj=self)

s1=School('oldboy1','北京','私立')print('from repr:',repr(s1))print('from str:',str(s1))print(s1)'''str函数或者print函数--->obj.__str__()

repr或者交互式解释器--->obj.__repr__()

如果__str__没有被定义,那么就会使用__repr__来代替输出

注意:这俩方法的返回值必须是字符串,否则抛出异常'''

print(format(s1,'nat'))print(format(s1,'tna'))print(format(s1,'tan'))print(format(s1,'asfdasdffd'))

六、__del__

析构方法,当对象在内存中被释放时,会自动触发执行。

当程序结束时,python只会回收自己的内存空间,即用户态内存,而操作系统的资源则没有被回收,这就需要我们定制__del__,在对象被删除前向操作系统发起关闭数据库链接的系统调用,回收资源

#class Foo:#def __del__(self):#print('run....')#obj = Foo()

#__call__:在对象被调用时会自动触发该方法,

classFoo:def __init__(self,x,y):

self.x=x

self.y=ydef __call__(self, *args, **kwargs):print(self,args,kwargs)

obj= Foo()

python面向对象难学_python-面向对象进阶相关推荐

  1. python难学嘛-python语言难学吗

    python就是以他简单易学出名的.几乎是现在最简单,却可塑性最高的语言了.一般有其它编程语言基础的,自学,三小时左右就能学会.现在Python都有给小朋友的教程,简单程度可见一般. Python的定 ...

  2. python面向对象生动讲解_Python面向对象语法精讲

    本专题的内容结构: 第一部分主要是:面向对象基础 第二部分主要是:面向对象进阶 第一部分的结构: unit1:面向对象编程模式: (1),面向对象编程思想 (2),面向对象的三个特征 (3),Pyth ...

  3. python面向对象编程中_Python面向对象编程中关于类和方法

    类和实例 python是一个面向对象的语言,而面向对象最重要的概念就是类和实例, 记得刚学习的时候不太理解这些概念,直到老师说了一句"物以类聚". 没错就是类, 归类 物以类聚 类 ...

  4. 学python和java哪个难?,java和python哪个难学

    java和python哪个好学 ①python比Java简单,学习成本低,开发效率高;②Java运行效率高于python,尤其是纯python开发的程序,效率极低;③Java相关资料多,尤其是中文资料 ...

  5. python学起来难不难-python很难学?学起来很吃力,想放弃?看别人是怎样学习的...

    其实吧, 你也没不能接受别人一分钟能赚你一辈子的钱吧- 比尔盖茨动动手指就有一套房子,你不是也没觉得有什么不对吗? 那你为什么不能接受有人一分钟能学你一辈子的知识- 别人用一分钟学你一个小时的事情,不 ...

  6. python人工智能难不难_python人工智能难吗

    人工智能是一门交叉学科,从被提出到现在也有六十多年的历史,目前仍处在AI初级阶段.之所以发展缓慢的一个重要原因是人工智能的技术难度很高,它涉及计算机.心理学.哲学等,对从业者要求很高,目前国内从事AI ...

  7. python面向对象难学_学不下去了!?详解Python面向对象核心概念,简历没跑了

    目前代码技能已经成了测试同学面试考核的刚需,对于测试开发来讲需求最大的是java和python两门语言,二者也都是面向对象语言.对于刚入门代码的同学来说面向对象相关的概念比较难于理解,而面向对象编程相 ...

  8. python最难学的是什么_python是最难学的语言吗

    Python基础语法-主线任务1 使用python就像一个自由度超高的游戏,你得学会以下几点python基础语法,拿到进入这个游戏世界的钥匙: 计算机组成原理Python开发环境Python变量流程控 ...

  9. python为什么那么难学_Python入门很难吗? 为什么越来越多的人都学Python?

    Python都说是最容易学习的编程语言,但是为什么还是有很多的小白在学习的过程中学的云里雾里,一天到晚都是报错,异常,这也怪不得会有那么多人说,学Python是从入门到入土!其实一门编程语言不像语文那 ...

最新文章

  1. 【转】【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途...
  2. Java常用四大线程池用法以及ThreadPoolExecutor详解
  3. 转载:写给计算机专业的朋友们
  4. ECharts简单的运行示列(固定数据和交互数据库)
  5. svn update -r m path 代码还原到某个版本(这样之前的log日志也就没了,也就是清空log日志)...
  6. 【问链-EOS公开课】第七课 EOS 宪法草案与 BP 协议
  7. VMware下Linux虚拟机安装及没有内网ip的三种解决方案
  8. 计算机二级通app打不开,计算机二级通app
  9. SAP Marketing Cloud里获取Contact Interaction的postman请求
  10. 什么是U-Boot以及如何下载U-Boot源码
  11. “要么你去驾驭生命,要么生命驾驭你。你的心态决定谁是坐骑,谁是骑师。”...
  12. 2d shader unity 阴影_UNITY崩坏3角色渲染实践
  13. 解决嵌套块级元素垂直外边距的塌陷
  14. flAbsPath on /var/lib/dpkg/status failed - realpath
  15. matlab大作业 m文件夹,matlab 基础知识汇总-- 记一次大作业
  16. 用 Python 绘制了若干张词云图,惊艳了所有人
  17. GoEasy使用方法记录
  18. Protues8.6仿真STM32出现错误-VDDA和VSSA的问题解决办法
  19. 第四天 轨道交通仿真入门
  20. 测试使用skywalking_APM工具Skywalking的使用和注意事项

热门文章

  1. 开源项目几点心得,Java架构必会几大技术点
  2. 谷歌浏览器(Chrome)遇到Flash崩溃的处理办法
  3. Java并发编程(07):Fork/Join框架机制详解
  4. 数据源管理 | 分布式NoSQL系统,Cassandra集群管理
  5. Socket编程实践(6) --TCP服务端注意事项
  6. 快速实现手势解锁功能
  7. RHEL6.2手动封装rpm源码包安装星际译王
  8. 建个数据中心就想发展IDC?没那么简单!
  9. JQuery实现旅游导航菜单应用方便
  10. java 的类和接口的变量调用