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反射和高阶内置方法相关推荐

  1. Python学习(十)——高阶内置函数

    内置函数 内置函数 高阶内置函数 abs().sum().round() map() filter() sorted() max().min() 内置函数 内置函数:python提供的,可以直接使用 ...

  2. python 面向对象_多态、内置方法、反射

    内容: 1.接口思想 2.抽象类思想 3.多态 4.内置方法 5.反射 1.接口思想 建立关联的桥梁,方便管理代码 接口类:用来定义功能的类,位继承它的子类提供功能 该类的功能方法一般不需要实现体,实 ...

  3. python常用内置模块-Python之OS模块常用内置方法汇总

    OS模块的常用内置方法 chdir修改当前工作目录到指定目录 Change the current working directory to the specified path. chmod修改一个 ...

  4. Python基础总结之常用内置方法总结

    文章目录 前言 1.str 1.1.内置方法: 1.2.常用的内置方法 1.3.String模块的一些方法 2.list 2.1.内置方法 2.2.常用内置方法 3.tupple 3.1.内置方法 3 ...

  5. python discuz搜索api_Django用内置方法实现简单搜索功能的方法

    Model中分别提供了filter方法和icontains方法实现简单的搜索功能. html页面中实现搜索框 模板api_test_manage.html中增加以下内容 {% csrf_token % ...

  6. 18.Python字符串类型及常用内置方法

    文章目录 1.字符串 2.字符串的定义 3.打印引号 4.类型转换 5.索引取值 6.遍历 7.长度统计 8.字符串复制与拼接 8.1字符串的复制 8.2加号拼接 8.3join拼接 8.4字符截取拼 ...

  7. Python 类对象及属性内置方法 classmethod、delattr、dir、hasattr、getattr、callable

    1. classmethod classmethod 修饰符对应的函数不需要实例化,不需要 self 参数.第一个参数需要是表示自身类的 cls 参数,能调用类的属性.方法.实例等. class Pe ...

  8. python将元祖设为整形_python基础(5)---整型、字符串、列表、元组、字典内置方法和文件操作介绍...

    对于python而言,一切事物都是对象,对象是基于类创建的,对象继承了类的属性,方法等特性 1.int 首先,我们来查看下int包含了哪些函数 #python3.x dir(int)#['__abs_ ...

  9. python的内置字典数据类型_python 数据类型元组与字典内置方法

    1.元组 (1)元组是不可变的列表,能存多个值:如果多个值只有取得需求,没有改的需求,用元组最合理 (2)定义:在()内用逗号隔开,可以存任意类型的值 注意:当元组只有一个元素时,要在后面加逗号 # ...

最新文章

  1. JustifyTextView 解决TextView中英文混排自动换行的问题
  2. 网站栏目该如何做SEO优化?
  3. mysql gtid 还是pxc_记一次 PXC 集群拆分引发的思考
  4. python不等于_Python小课堂|注释+运算符
  5. 【bzoj4550】小奇的博弈 博弈论+dp
  6. oracle数据库影响网络延时,磁盘排序对Oracle数据库性能的影响-通信/网络-与非网...
  7. grep正则表达式后面的单引号和双引号的区别?
  8. 代码随想录怎么样?我是这样刷的
  9. 树莓派声音输出设置_树莓派3 之 音响配置
  10. 【2016浴雨沐风】(第一篇)
  11. Allegro原理图反标教程
  12. mysql千万级数据查询select、插入insert慢 可能原因总结
  13. 吃烧烤之命令模式学习笔记[C++版]
  14. 当前你所在的服务器更新维护尚未完成,我们将于01月16日09:00-13:00对所有服务器进行更...
  15. 多地雾霾空气污染严重
  16. java split 换行_如何将多行字符串拆分为多行?
  17. android视频格式添加,Android添加新的视频格式--媒体库扫描
  18. python数据结构与算法 (翻译)第一章
  19. HTML5文本框右侧加一个放大镜,html5图像局部放大镜(可调节)
  20. 进程间通信方式——管道

热门文章

  1. js 获取中文的拼音
  2. 【USACO 3.1】Contact(01子串按出现次数排序)
  3. 重构一个功能块的总结
  4. PHP 表单和用户输入
  5. python 文件操作的模块_Python之文件操作修改模块
  6. 【ABAP】SUBMIT程序相互调用
  7. 【MM模块】ERS and Invoicing Plans 发票计划
  8. 关于SAP的SD的定价公式的资料
  9. SAP固定资产期初导入检查
  10. 不需要SAP请求号修改程序的方法