面向对象进阶---attr家族
一、 isinstance(obj,cls)和issubclass(sub,super)
isinstance(obj,cls)检查obj是否是类 cls 的对象
class Foo:
pass
obj=Foo()
print(isinstance(obj,Foo))
打印结果为
True
issubclass(sub, super)检查sub类是否是 super 类的派生类
class Foo(object):
pass
class Bar(Foo):
pass
print(issubclass(Bar, Foo))
d打印结果为
True
二、反射
1、概念:主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)
2、四个实现反射的函数:都是通过字符串的形式
(1)hasattr(object,name):判断object中有没有一个name字符串对应的方法或属性
def getattr(object, name, default=None): # known special case of getattr
"""
getattr(object, name[, default]) -> value
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
"""
pass
(2)getattr(object,name):查看类object中的name字符串对应的值
def getattr(object, name, default=None): # known special case of getattr
"""
getattr(object, name[, default]) -> value
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
"""
pass
(3)setattr(object,name,value):将object中name字符串的值设置为value
def setattr(x, y, v): # real signature unknown; restored from __doc__
"""
Sets the named attribute on the given object to the specified value.
setattr(x, 'y', v) is equivalent to ``x.y = v''
"""
pass
(4)delattr(object,name):删除object类中的name字符串属性
def delattr(x, y): # real signature unknown; restored from __doc__
"""
Deletes the named attribute from the given object.
delattr(x, 'y') is equivalent to ``del x.y''
"""
pass
(5)综合示例
class People:
country='China'
def __init__(self,name):
self.name=name
def walk(self):
print('%s is walking' %self.name)
p=People('egon')
print('name' in p.__dict__)
print(hasattr(p,'name')) #hasattr查看是p实例内是否有name属性
print(hasattr(p,'country'))
print(hasattr(People,'__init__'))
print(getattr(p,'walk')) #getattr查看p对象内walk的属性值
res=getattr(p,'country') #getattr获取属性
print(res)
getattr(p,'xxxxxxxxx','这个属性不存在') #可以指定返回值,如果要找的属性不存在,会返回指定的字符串
setattr(p,'country','123') #setattr修改
print(getattr(p,'country'))
delattr(p,'country') #delattr删除p对象内的country
print(hasattr(p,'country')) #查看p对象内还有没有country
打印结果如下
True
True
True
True
<bound method People.walk of <__main__.People object at 0x00000000010847F0>>
China
123
True
三、内置函数attr(setattr,getattr,delattr)
#setattr:设置属性
# getattr:查找属性,只在对象不存在的情况下才触发
# delattr:删除属性
#这些内置方法只是确定了class的调用方法,具体的操作需要def 内部的代码
class Foo:
def __init__(self,name):
self.name=name
def __setattr__(self, key, value): #设置
print('-----setattr---key:%s,value:%s'%(key,value))
print(type(key))
print(type(value))
self.__dict__[key]=value
def __delattr__(self, item): #删除
print('delattr:%s' %item)
del self.__dict__[item]
def __getattr__(self, item): #属性不存在的情况下才会触发
print('getattr-->%s %s' %(item,type(item)))
四、综合示例:定制自己的数据类型(继承)
#创建列表,往列表内插入元素,每个元素都必须是int
class List(list): #创建List类,继承list
def append(self, p_object): #append函数
print('------>',p_object)
if not isinstance(p_object,int): #如果p_object不是int,返回类型错误
raise TypeError('必须是整型')
super().append(p_object) #如果是int,调用父类(list)的append方法将值插入列表
def insert(self,index,p_object): #定义一个insert函数
if not isinstance(p_object,int):
raise TypeError('必须是整型')
super().insert(index,p_object)
l=List([1,2,3])
print(l)
l.append(4)
print(l)
l.insert(4,5)
print(l)
五、综合示例:授权的方式定制文件的增删改查
import time
class Open:
def __init__(self,filepath,mode='r',encoding='utf8'):
self.filepath=filepath
self.mode=mode
self.encoding=encoding
self.x=open(filepath,mode=mode,encoding=encoding)
def write(self,line):
t=time.strftime('%Y-%m-%d %x')
self.x.write('%s %s' %(t,line))
def __getattr__(self, item):
return getattr(self.x,item)
f=Open('b.txt','w')
f.write('1111111\n')
f.write('2222222\n')
f.write('3333333\n')
f.write('3333333\n')
f.close()
f=Open('b.txt','r+')
# f.seek(0)
res=f.read()
print(res)
面向对象进阶---attr家族的更多相关文章
- Python面向对象进阶和socket网络编程-day08
写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...
- Python面向对象进阶和socket网络编程
写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- day26、面向对象进阶:多态、封装、反射
一.多态 什么是多态: 类的继承有两层意义:1.改变 2.扩展 多态就是类的这两层意义的一个具体的实现机. 即:调用不同类实例化的对象,下的相同的方法,实现的过程不一样 python中的标准类型就是多 ...
- 周末班:Python基础之面向对象进阶
面向对象进阶 类型判断 issubclass 首先,我们先看issubclass() 这个内置函数可以帮我们判断x类是否是y类型的子类. class Base: pass class Foo(Base ...
- 铁乐学python_day23_面向对象进阶1_反射
铁乐学python_day23_面向对象进阶1_反射 以下内容大部分摘自博客http://www.cnblogs.com/Eva-J/ isinstance()和issubclass() 两者的返回值 ...
- Python中级 —— 01面向对象进阶
面向对象进阶 总结.补充(http://blog.csdn.net/fgf00/article/details/52479307) 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 ...
- Py-多态,封装,反射,描述符,包装标准类型,面向对象进阶
多态: 对象可以通过他们共同的属性和动作来访问,而不需要考虑他们的类多态是继承的应用 class H2o: def __init__(self,temp): self.temp=temp def ht ...
- Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)
Python开发[第七篇]:面向对象 详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)> ...
随机推荐
- 数字不断递增 可控制js
(function($){ $.fn.numberRock=function(options){ var defaults={ speed:, count: }; var opts=$.extend( ...
- 移动端HTML5性能优化
移动端HTML5性能优化 [导读] 得益于智能手机的普及和各行各业互联网+的运动,移动端的市场占比疯狂增长. 2016年1月发布的2015年电商数据显示,2015年中国移动端网购交易额同比暴涨123 ...
- linux性能调试之vmstat
linux性能监控调优工具vmstat: vmstat:用于监控.显示系统运行过程中的虚拟内存/CPU/磁盘状态. 简单示例(时间间隔2s,监控2次): 重要字段解释: r 表示运行队列(等待运行的进 ...
- 【Python】 获取MP3信息replica
replica 初衷是想要整理iphone中的音乐.IOS(我自己的手机还是IOS8.3,新版本的系统可能有变化了)自带的音乐软件中所有音乐文件都存放在/var/mobile/Media/iTunes ...
- Algorithm --> 最长回文子串
1.中心扩展 中心扩展就是把给定的字符串的每一个字母当做中心,向两边扩展,这样来找最长的子回文串.算法复杂度为O(N^2). 但是要考虑两种情况: 1.像aba,这样长度为奇数. 2.想abba,这样 ...
- 如何让shell脚本自杀
有些时候我们写的shell脚本中有一些后台任务,当脚本的流程已经执行到结尾处并退出时,这些后台任务会直接挂靠在init/systemd进程下,而不会随着脚本退出而停止. 例如: [root@maria ...
- UWP 拖拽文件
桌面环境下的UWP,加入拖拽模式还是会增加用户好感度的. 好了,先看一下我最新研发的[小微识别]吧,演示一下 炫酷,有没有,
- 关于C语言的第0次作业
1.你认为大学的学习生活.同学关系.师生关系应该是怎样的?请一个个展开描述. 我认为的大学学习生活是充实的,丰富多彩的,与高中快节奏.繁忙的生活有所不同.在上了大学我们都成熟了很多,懂得了包容与忍让, ...
- 每日冲刺报告——Day4(Java-Team)
第四天报告(11.5 周日) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://git ...
- 学号:201621123032 《Java程序设计》第9周学习总结(
1:本周学习总结 1.1:以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容 2:书面作业 2.1: List中指定元素的删除(题集题目) 2.1.1:实验总结.并回答:列举至少2种在List ...