内置方法

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

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

class Foo(object):pass
obj = Foo()
isinstance(obj, Foo)

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

class Foo(object):pass
class Bar(Foo):pass
issubclass(Bar, Foo)

反射

反射:通过字符串映射到对象的属性

class BlackMedium:feature='Ugly'def __init__(self,name,addr):self.name=nameself.addr=addrdef sell_house(self):print('%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼' %self.name)def rent_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__)

setattr,delattr,getattr方法

用法

class Foo: #Dictdef __init__(self,name):self.name=namedef __getitem__(self, item): #item='namexxx'# print('getitem...')return self.__dict__.get(item)def __setitem__(self, key, value):# print('setitem...')# print(key,value)self.__dict__[key]=valuedef __delitem__(self, key):# print('delitem...')# print(key)del self.__dict__[key]
T = Foo('alex')
# print(T.__dict__)
#查,会触发getitem的运行
print(T['name'])
#改,会触发setitem的运行
T['name'] = 'Alex'
print(T['name'])
#删除,会触发detitem的运行
del T['name']
print(T['name'])

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}',#学校类型/学校地址/学校名
}
class School:def __init__(self,name,addr,type):self.name=nameself.addr=addrself.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_specif not format_spec or format_spec not in format_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'))

自定format方法:

dic_time = {'ymd':'{0.year}:{0.month}:{0.day}','dmy':'{0.day}/{0.month}/{0.year}','myd':'{0.month}--{0.year}--{0.day}',
}class  Date:def __init__(self,year,month,day):self.year = yearself.month = monthself.day = daydef __format__(self, format_spec):if not format_spec or format_spec not in dic_time:format_spec = 'ymd'fmt = dic_time[format_spec]return fmt.format(self)
d1 = Date(2018,3,22)
print(format(d1))
print('{:dmy}'.format(d1))

del方法

析构方法,当对象在内存中被释放时,自动触发执行
注:如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__,如果产生的对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源,比如(打开一个文件,创建一个数据库链接),则必须在清除对象的同时回收系统资源,这就用到了__del__。

class Open:def __init__(self,filename):print('open file.......')self.filename=filenamedef __del__(self):print('回收操作系统资源:self.close()')f=Open('settings.py')
# del f #f.__del__()
print('----main------') #del f #f.__del__()

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

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

class List(list): #继承list所有的属性,也可以派生出自己新的,比如append和middef append(self, p_object):' 派生自己的append:加上类型检查'if not isinstance(p_object,int):raise TypeError('must be int')super().append(p_object)@propertydef mid(self):'新增自己的属性'index=len(self)//2return self[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)

练习(clear加权限限制)

class List(list):def __init__(self,item,tag=False):super().__init__(item)self.tag=tagdef append(self, p_object):if not isinstance(p_object,str):raise TypeErrorsuper().append(p_object)def clear(self):if not self.tag:raise PermissionErrorsuper().clear()l=List([1,2,3],False)
print(l)
print(l.tag)l.append('saf')
print(l)# l.clear() #异常l.tag=True
l.clear()
```py

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

#**授权示范一**
import time
class FileHandle:def __init__(self,filename,mode='r',encoding='utf-8'):self.file=open(filename,mode,encoding=encoding)def write(self,line):t=time.strftime('%Y-%m-%d %T')self.file.write('%s %s' %(t,line))def __getattr__(self, item):return getattr(self.file,item)f1=FileHandle('b.txt','w+')
f1.write('你好啊')
f1.seek(0)
print(f1.read())
f1.close()
#授权示范二
#我们来加上b模式支持
import time
class FileHandle:def __init__(self,filename,mode='r',encoding='utf-8'):if 'b' in mode:self.file=open(filename,mode)else:self.file=open(filename,mode,encoding=encoding)self.filename=filenameself.mode=modeself.encoding=encodingdef write(self,line):if 'b' in self.mode:if not isinstance(line,bytes):raise TypeError('must be bytes')self.file.write(line)def __getattr__(self, item):return getattr(self.file,item)def __str__(self):if 'b' in self.mode:res="<_io.BufferedReader name='%s'>" %self.filenameelse:res="<_io.TextIOWrapper name='%s' mode='%s' encoding='%s'>" %(self.filename,self.mode,self.encoding)return res
f1=FileHandle('b.txt','wb')
# f1.write('你好啊啊啊啊啊') #自定制的write,不用在进行encode转成二进制去写了,简单,大气
f1.write('你好啊'.encode('utf-8'))
print(f1)
f1.close()

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

转载于:https://www.cnblogs.com/yjiu1990/p/9144517.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

会议中的Meeting App

接着我们上两篇博客文章&#xff0c;我们说了如何开发会议前和会议后的 meeting app&#xff0c;那如何开发一个会议中的 app 呢&#xff0c;实际上比较简单&#xff0c;我们只需要在 tab 的配置项中勾选下面这两个选项即可。 勾选后&#xff0c;我们安装app到我们的一个会议中…

0-2岁的app开发人员必读,Android开发APP前的准备事项

2019独角兽企业重金招聘Python工程师标准>>> 随着移动互联网的兴起&#xff0c;各行各业对移动应用的需求越来越大&#xff0c;从事APP开发的人也越来越多&#xff0c;APP开发行业可以说是方兴未艾。APP开发是比较复杂的事情&#xff0c;涉及产品、美工设计、服务器…

FixedThreadPool吞掉了异常

为了方便遍描述问题&#xff0c;如下是简化后的 public class RunException {public static void main(String[] args) { ExecutorService readerPool Executors.newFixedThreadPool(3); readerPool.submit(new Runnable() { public void run() { throw new RuntimeException(…

Teams Meeting App的 task 弹出框

前几篇文章我们介绍了 Teams Meeting App 的各种类型和如何从无到有的使用 net6 和 c# 来开发一个 Teams Meeting app&#xff0c;那今天我们开始讨论一些 meeting app 的高级互动&#xff1a; task 弹出框。我们先来快速修改一下之前的代码&#xff0c;看看什么是 task 弹出框…

react 学习

react官网地址&#xff1a;http://facebook.github.io/react/ webpack官网地址&#xff1a;http://webpack.js.org/ 英文 https://www.webpackjs.com/ 中文 参考资料&#xff1a; React 入门实例教程-阮一峰 webpack的学习 学习列表&#xff1a; 了解react的语法&#x…

如何获取Teams Meeting 详情

最近有一些朋友问我&#xff0c;有没有可能获取到会议的详情&#xff0c;我搜索了目前所有的 teams 文档&#xff0c;发现有一个api可以获取&#xff0c;不过在我写这篇文章的时候&#xff0c;这个 api 还在 preview 阶段&#xff0c;可能在正式发布前&#xff0c;还会有一些变…

C++ : 内联函数和引用变量

一.内联函数 内联函数和普通函数的使用方法没有本质区别&#xff0c;我们来看一个例子&#xff0c;下面展示了内联函数的使用方法&#xff1a; #include <iostream> using namespace std; //下面展示内联函数的使用 inline double square(double x) {return (x*x);} int…

Teams Meeting 实时事件通知

Microsoft Teams最近推出了很多新的功能和api&#xff0c;我们今天就来一起看一下 teams 会议的实时事件通知&#xff0c;我觉得有了这个功能&#xff0c;我们的app&#xff0c;我们的bot又可以有很多可以实现的场景了。 我们来看看如何在 c# 里处理会议开始和结束这两个事件。…

error记录 | 不能将参数 1 从“const char [5]”转换为“LPCTSTR

Windows使用两种字符集ANSI和UNICODE&#xff0c;前者就是通常使用的单字节方式&#xff0c;但这种方式处理象中文这样的双字节字符不方便&#xff0c;容易出现半个汉字的情况。而后者是双字节方式&#xff0c;方便处理双字节字符。Windows NT的所有与字符有关的函数都提供两…

JMM 学习笔记

并发编程的模型 并发编程需要解决的两个问题&#xff1a;线程之间如何同步&#xff0c;线程之间如何通信。 线程之间通信&#xff1a;共享内存&#xff0c;消息传递。 共享内存通过线程之间读-写程序的公共状态进行通信。消息传递要通过线程之间主动传递消息进行通信。 线程之间…

嵌套函数,匿名函数,高阶函数

目录 嵌套函数匿名函数高阶函数嵌套函数 就是在函数里再定义一个函数 # 1,函数内部可以在定义函数 # 2,函数要想执行&#xff0c;必须要先被调用 def name1():print(kk)def name2():print(vfx)name2() name1() 输出&#xff1a; kk vfx name2 现在他内部代码找输出&#xff0c;…

Teams Developer Portal介绍

在去年的 Build2021 大会上讲到的 Teams Developer Portal 已经上线一段时间了&#xff0c;我这几天玩了一下&#xff0c;发现比之前的 app studio 强大了很多&#xff0c;所以赶快写篇文章和大家分享。 Developer Portal 有两种访问的方式&#xff0c;一个是网页版&#xff0…

使用环境变量来配置 Teams App 的 manifest

上篇文章我们介绍了 Teams 的 Developer Portal&#xff0c;今天我想分享一个dev portal里一个比较实用的功能。这个功能在之前的 App Studio 里没有。这个功能叫 Environment variables。 当我们真实开发一个 teams app的时候&#xff0c;肯定有自己的开发环境&#xff0c;测…

[Unity优化]批处理03:静态批处理

[Unity优化]批处理03&#xff1a;静态批处理 原理&#xff1a; 运行时&#xff0c;把需要进行静态批处理的网格合并到一个新的网格中。虽然只进行一次合并操作&#xff0c;但是会占用更多的内存来存储合并后的网格&#xff0c;并且被静态批处理的物体无法移动旋转缩放 要使用静…

制造领域的人工智能技术

“AI将执行制造、质量控制、缩短设计时间、减少材料浪费、提高生产再利用率&#xff0c;执行预测性维护等等&#xff0c;尽管人工智能有望从根本上改变很多行业&#xff0c;但该技术非常适合制造业”Ng说。Andrew Ng是深度学习Google Brain项目的创始人兼斯坦福大学计算机科学兼…

如何获取一个会议的 transcripts

Teams 开发团队在过去半年里提供了很多的关于会议的 api&#xff0c;这让我们又有了很多的可以实现的功能和场景。今天我要介绍的是如何获取会议的 transcripts。 首先我们要知道的一个概念是&#xff1a;一个会议 meeting 可能有很多的 transcript&#xff0c;是一对多的关系…

JS获取IP地址

HTML代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script src"https://unpkg.com/vue/dist/vue.js"></script></head><body><div id"vm&quo…

1小时玩爆趣头条自媒体平台,增粉实战操作分享

做自媒体的人最关注的就是每天自己账号的后台数据&#xff0c;因为数据决定当天的收益。因此只要每天能达到几十万的数据&#xff0c;相信对于做自媒体的朋友来说&#xff0c;一个月下来&#xff0c;最少也有1万以上的收入。目前&#xff0c;自媒体平台能赚钱的平台有很多&…

营业额统计

传送门 这个题...裸题啊,裸的不能再裸了 按天数插入,每次插入之后,比较和前驱后继的差,取 min 统计入答案即可 注意之前已经插入过的值就不需要插入了.然后这题就 A 了 Code: #include <iostream> #include <cstdlib> #include <cstdio> #include <ctime&…

React setStats数组不更新,百思不得其解。

楼楼今日遇到个坑爹的问题。 就是 this.setStats({}) 对 this.stats 不更新问题 问题是这样的 constructor(props) {super(props);this.state {imageList: []}WechatService.getMaterialOrealList("image").then((result) > {this.setState({imageList: result})…