面向对象进阶---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 面向对象(初级篇)> ...
随机推荐
- [译]ASP.NET Core依赖注入深入讨论
原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...
- JAVA常见简答题
一.基础知识 1.简述使用文本编辑器和 JDK 创建并运行 Java 应用程序的基本步骤. 答:①打开文本编辑器输入 Java 源程序: ②保存文件,文件名为源程序中 public 修饰类的类名,扩展 ...
- Spring Boot Druid数据源配置
package com.hgvip.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.su ...
- elementUI-事件绑定Bug
刚开始使用elementUI的,慢慢的摸索.今天在绑定click事件的时候,在给el-某标签绑定.然后事件失效了.我就很纳闷,这怎么可能失效呢,当我给它的自己元素嵌套了一层div的时候,仍可是使用所以 ...
- Axure RP初学
制作商品购买页
- 设计模式之 观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...
- oracle 分析函数中 keep关键字的使用
语法 min | max(column1) keep (dense_rank first | last order by column2) over (partion by column3); 另外f ...
- vmware虚拟机和网络中的桥接和NAT
vmware虚拟机和网络中的桥接和NAT 有许多人在网上回答类似的问题,但大多说的不够简单,且互相抄袭的嫌疑很大,这里我尽自己努力把问题说的明白一些 首先解释一下什么是NAT(network addr ...
- Thinkjs关系数据库学习——查询数据
模型提供了多种方法来查询数据: find 查询单条数据 select 查询多条数据 count 查询总条数 countSelect 分页查询数据 max 查询字段的最大值 avg 查询字段的平均值 m ...
- 微信app支付详细教程
微信支付作为三大支付之一,越来越多的客户要求产品中添加微信支付 但是网上能找到可用的demo很少 所以写一篇自己写微信支付的过程,希望能给有需要的开发者一点帮助. 下面让我们来进入正题 1准备工作 ...