python反射和高阶内置方法
1.isinstance:判断对象和类的关系
#判断结果返回bool类型
class A:pass
class B(A):pass
a = A()
print(isinstance(a,A)) #True isinstance(对象,类)
2.issubclass:判断子类和父类的关系
#判断结果返回bool类型
class A:pass
class B(A):pass
a = A()
print(issubclass(B,A)) #True issubclass(子类,父类)
3.反射
是用字符串类型的名字,去操作变量
反射对象中的属性和方法:
- hasattr
- getattr
- setattr
- delattr
3.1 getattr(重要)
反射对象的属性 —getattr(对象,属性)
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A:def func(self):print('in func')a = A()
a.name = 'liyanan'
a.age = 18
# 反射对象的属性 --getattr(对象,属性)
ret = getattr(a,'name') # 通过变量名的字符串形式取到的值
print(ret)user = input('>>>>')
print(getattr(a,user)) #假如输入name,则执行a.name
反射对象的方法 —getattr(对象,方法)
#接上
# 反射对象的方法
ret = getattr(a,'func') #getattr(a,'func') == a.func
ret()反射类的属性class A:price = 20def func(self):print('in func')# 反射类的属性
# A.price
print(getattr(A,'price'))
反射类的方法
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A:price = 20@classmethoddef func(self):print('in func')# 反射类的方法:classmethod staticmethod
# A.func()
if hasattr(A,'func'): #判断类中是否存在第二个参数的方法getattr(A,'func')() #如果有就执行
反射模块的属性
import my # my为自己写的其他模块
#反射模块的属性 my.day为模块的属性
print(getattr(my,'day'))
反射模块的方法
#反射模块的方法
getattr(my,'func')()
内置模块也能用反射
反射自己模块中的变量和函数
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import sys
# print(sys.modules['__main__'])
year = 2019
def login():print('welcome')#反射自己模块中的变量
print(getattr(sys.modules[__name__],'year'))
user_in = input('>>>')
print(getattr(sys.modules[__name__],user_in))#反射自己模块中的函数
getattr(sys.modules[__name__],'login')()
3.2 hasattr
与getattr配合使用,主要做判断
注意参数要跟getattr保持一致
import sysyear = 2019if hasattr(sys.modules[__name__],'year'):print(getattr(sys.modules[__name__],'year'))
3.3 setattr(了解)
设置修改变量
setattr(对象,‘要修改的属性’,‘修改的内容’)
class A:passa = A()
setattr(a,'name','nezha')
setattr(A,'name','taibaijinxing')
print(a.name) #打印nezha
print(A.name) #打印taibaijinxing
3.4 delattr(了解)
删除一个变量
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A:passa = A()
setattr(a,'name','nezha')
setattr(A,'name','taibaijinxing')delattr(a,'name')
print(a.name) #打印taibaijinxing,因为实例化对象调用了父类的name属性
delattr(A,'name')
print(a.name) #报错,没有name属性
4.高阶内置方法
__del__
方法:析构函数:在删除一个对象之前,进行的一些收尾工作
class A:def __del__(self): #析构函数:在删除一个对象之前进行一些收尾工作self.f.close()a = A()
a.f = open('db.txt','r',encoding='utf-8') # 打开文件,拿到了文件操作句柄
del a #del既执行了这个方法,又删除了变量
__call__
方法:实例化后的对象加括号,相当于默认执行了此方法
class A:def __init__(self,name):self.name = namedef __call__(self, *args, **kwargs):for k in self.__dict__:print(k,self.__dict__[k])a = A('liyanan')() #实例化对象后加括号相当于执行了内部的__call__方法
#a() 结果为打印self.__dict__中的静态属性 name liyanan
item方法
- getitem
- setitem
- delitem
- 附加的delattr
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Foo:def __init__(self,name,age,sex):self.name = nameself.age = ageself.sex = sex#getitem方法def __getitem__(self, item):if hasattr(self,item): #判断item是否存在/传值return self.__dict__[item]#setitem方法def __setitem__(self, key, value):self.__dict__[key] = value#delitem方法def __delitem__(self, key):del self.__dict__[key]#delattr方法def __delattr__(self, item):print('del obj.key时,我执行')self.__dict__.pop(item)f = Foo('alec','18','男')
print(f['name']) #f['']这种格式默认执行了类中的__getitem__方法,等于f.namef['hobby'] = 'python' #默认调用了setitem方法,使类中的字典添加了key和value
print(f.hobby,f['hobby']) #结果都为pythondel f.hobby #先调用类中的delattr方法,如果没有就调用object中的(直接删除)
del f['hobby'] #默认调用了delitem方法,删除了类中的静态属性
__new__
用法(面试会考)
所有的类中都是先执行__new__
方法,再执行__init__
方法
使用场景:设计模式:单例模式:只能有一个实例化对象,后面实例化的对象属性都会覆盖第一个对象的属性,如果没有覆盖则用第一个对象的属性
#单例模式
class A:__instance = False #设置一个私有属性def __init__(self,name,age):self.name = nameself.age = agedef __new__(cls, *args, **kw): #先执行new,再执行__init__方法if cls.__instance:return cls.__instancecls.__instance = object.__new__(cls)return cls.__instanceyanan = A('yanan',26)
yanan.cloth = 'cool'
beijing = A('beijing',23)
print(yanan) #<__main__.A object at 0x000001B336D38C50>
print(beijing) #<__main__.A object at 0x000001B336D38C50> 一样的内存地址,证明只能实例化一个对象
print(yanan.name) #beijing 被第二次实例化对象<北京>给覆盖了
print(beijing.name) #beijing
print(beijing.cloth) #cool 第二次实例化对象<北京>没有覆盖,则用第一个对象的属性
__eq__
方法
用法:比较实例化后的对象属性是否相等
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A:def __init__(self,name):self.name = name#eq方法def __eq__(self, other):if self.__dict__ == other.__dict__:return Trueelse:return Falseob1 = A('pig')
ob2 = A('pig')
print(ob1 == ob2) #True
__hash__
方法
hash()是系统的哈希用法,以对象的内存地址进行哈希的
__hash__
可以自己控制哈希用法
class A:def __init__(self,name,sex):self.name = nameself.sex = sexdef __hash__(self):return hash(self.name+self.sex)a = A('agg','公')
b = A('agg','公')
print(hash(a))
print(hash(b))
#系统的哈希用法是根据内存地址处理的
#此类中的自己写的哈希算法是根据值来处理的
示例:
实例化对象去重
class A:def __init__(self,name,sex,age):self.name = nameself.sex = sexself.age = agedef __eq__(self, other):if self.name == other.name and self.sex == other.sex:return Truereturn Falsedef __hash__(self):return hash(self.name + self.sex)a = A('agg','公',5)
b = A('agg','公',5)
print(hash(a))
print(hash(b))
print(set((a,b))) #去重,去除重复的实例化对象(只去重name和sex)
python反射和高阶内置方法相关推荐
- Python学习(十)——高阶内置函数
内置函数 内置函数 高阶内置函数 abs().sum().round() map() filter() sorted() max().min() 内置函数 内置函数:python提供的,可以直接使用 ...
- python 面向对象_多态、内置方法、反射
内容: 1.接口思想 2.抽象类思想 3.多态 4.内置方法 5.反射 1.接口思想 建立关联的桥梁,方便管理代码 接口类:用来定义功能的类,位继承它的子类提供功能 该类的功能方法一般不需要实现体,实 ...
- python常用内置模块-Python之OS模块常用内置方法汇总
OS模块的常用内置方法 chdir修改当前工作目录到指定目录 Change the current working directory to the specified path. chmod修改一个 ...
- Python基础总结之常用内置方法总结
文章目录 前言 1.str 1.1.内置方法: 1.2.常用的内置方法 1.3.String模块的一些方法 2.list 2.1.内置方法 2.2.常用内置方法 3.tupple 3.1.内置方法 3 ...
- python discuz搜索api_Django用内置方法实现简单搜索功能的方法
Model中分别提供了filter方法和icontains方法实现简单的搜索功能. html页面中实现搜索框 模板api_test_manage.html中增加以下内容 {% csrf_token % ...
- 18.Python字符串类型及常用内置方法
文章目录 1.字符串 2.字符串的定义 3.打印引号 4.类型转换 5.索引取值 6.遍历 7.长度统计 8.字符串复制与拼接 8.1字符串的复制 8.2加号拼接 8.3join拼接 8.4字符截取拼 ...
- Python 类对象及属性内置方法 classmethod、delattr、dir、hasattr、getattr、callable
1. classmethod classmethod 修饰符对应的函数不需要实例化,不需要 self 参数.第一个参数需要是表示自身类的 cls 参数,能调用类的属性.方法.实例等. class Pe ...
- python将元祖设为整形_python基础(5)---整型、字符串、列表、元组、字典内置方法和文件操作介绍...
对于python而言,一切事物都是对象,对象是基于类创建的,对象继承了类的属性,方法等特性 1.int 首先,我们来查看下int包含了哪些函数 #python3.x dir(int)#['__abs_ ...
- python的内置字典数据类型_python 数据类型元组与字典内置方法
1.元组 (1)元组是不可变的列表,能存多个值:如果多个值只有取得需求,没有改的需求,用元组最合理 (2)定义:在()内用逗号隔开,可以存任意类型的值 注意:当元组只有一个元素时,要在后面加逗号 # ...
最新文章
- JustifyTextView 解决TextView中英文混排自动换行的问题
- 网站栏目该如何做SEO优化?
- mysql gtid 还是pxc_记一次 PXC 集群拆分引发的思考
- python不等于_Python小课堂|注释+运算符
- 【bzoj4550】小奇的博弈 博弈论+dp
- oracle数据库影响网络延时,磁盘排序对Oracle数据库性能的影响-通信/网络-与非网...
- grep正则表达式后面的单引号和双引号的区别?
- 代码随想录怎么样?我是这样刷的
- 树莓派声音输出设置_树莓派3 之 音响配置
- 【2016浴雨沐风】(第一篇)
- Allegro原理图反标教程
- mysql千万级数据查询select、插入insert慢 可能原因总结
- 吃烧烤之命令模式学习笔记[C++版]
- 当前你所在的服务器更新维护尚未完成,我们将于01月16日09:00-13:00对所有服务器进行更...
- 多地雾霾空气污染严重
- java split 换行_如何将多行字符串拆分为多行?
- android视频格式添加,Android添加新的视频格式--媒体库扫描
- python数据结构与算法 (翻译)第一章
- HTML5文本框右侧加一个放大镜,html5图像局部放大镜(可调节)
- 进程间通信方式——管道