0418 面向对象进阶 反射内置函数
绑定:class A:def func1(self):pass # 对象与方法之间的绑定def func4(self): pass # 对象与方法之间的绑定 @classmethoddef func2(cls): pass # 类与方法之间的绑定 @staticmethoddef func3(): pass
a = A()b = A()
普通方法 对象和类绑定的过程print(A.func1) <function A.func1 at 0x02189660>print(a.func1) <bound method A.func1 of <__main__.A object at 0x0217BD70>>print(b.func1) <bound method A.func1 of <__main__.A object at 0x0217BD90>>
类方法 由于不适用对象内存空间中的属性,所以不会将对象和方法绑在一起而是将类和方法绑在一起print(A.func2)print(a.func2) # 对象能找到类 类里面绑着方法print(b.func2) 都是<bound method A.func2 of <class '__main__.A'>> 静态方法 不是绑定方法 没有和对象或者类发生任何绑定关系print(A.func3) <function A.func3 at 0x021D95D0>print(a.func3) <function A.func3 at 0x021D95D0>print(b.func3) <function A.func3 at 0x021D95D0>
isinstance和issubclass
isinstance判断一个对象和一个类有没有血缘关系class A:passclass B(A):passclass C(B):passa=A()b=B()c=C()print(isinstance(c,B)) Trueprint(isinstance(B,A)) False
print(isinstance(a,A))print(isinstance(a,B)) # 能够检测到继承关系print(type(a) is A)print(type(a) is B) # type只单纯的判断类 issubclass
print(issubclass(C,B)) Trueprint(issubclass(A,B)) False
issubclass(子类名,父类名) 如果返回True,说明有继承关系
反射 正常情况下如果可以拿到这个变量 那么如有有这个变量的字符串形式 就是用反射可以获取到这个值 使用字符串数据类型的变量名 访问一个命名空间中的名字 找一个属性 ,直接就可以找到这个属性的值 找一个方法 ,找到的是这个方法的内存地址 hasattr() 判断一个命名空间中有没有这个名字 getattr() 从命名空间中获取这个名字对应的值
类中的反射 类可以获取类中的属性和方法
class A: role = 'Person'def func(self): print('666')a = A()if hasattr(A,'role'): print(getattr(A,'role')) # 从A的命名空间里找一个属性 ,直接就可以找到这个属性的值if hasattr(A,'func'): f = getattr(A,'func');f(1)# 从A的命名空间里找一个方法 ,找到的是这个方法的内存地址 getattr(A, 'func')(1)
对象使用对象能用的方法和属性
class A: def __init__(self,age): self.age = age def func(self): print(123)a = A(100)print(getattr(a,'age')) 100getattr(a,'func')() 123
模块使用模块中的名字,从自己所在的模块中使用自己名字def login(): print('登录')def register(): print('注册')import sys # 和python解释器相关的内容都在sys里print(sys.modules['__main__'])func = input('>>>')if hasattr(sys.modules['__main__'],func): getattr(sys.modules['__main__'],func)() 登录
类使用类命名空间中的名字 getattr(类名,'名字')对象使用对象能用的方法和属性 getattr(对象名,'名字')模块使用模块中的名字 导入模块 getattr(模块名,'名字')import os ; getattr(os,'rename')('user','user_info')从自己所在的模块中使用自己名字import sys getattr(sys.modules['__main__'],名字) getattr一定要和hasattr配合使用 反射 4个内置函数getattr ******hasattr ******setattr # 修改和新建 **delattr # 删除一个属性 *
增删改 对象属性class A:def __init__(self,name):self.name = namedef func(self):print(666) a =A('alex') print(a.name) alex setattr(a,'name','egon') 修改属性 print(a.__dict__) {'name': 'egon'} setattr(a,'age',73) 增加属性 print(a.__dict__) {'name': 'egon', 'age': 73} delattr(a,'age') 删除属性 print(a.__dict__) {'name': 'egon'}
增删改 方法class A:def __init__(self,name): self.name = name def wahaha(self): print('wahahahahaha') def qqxing(self): print('qqqqqxing') a = A('alex')# setattr(A,'qqxing',qqxing)setattr(a,'qqxing',qqxing)# print(a.__dict__)a.qqxing(a)
转载于:https://www.cnblogs.com/Mr-Murray/p/8875868.html
0418 面向对象进阶 反射内置函数相关推荐
- python内置函数与闭包_Python进阶(五)----内置函数Ⅱ 和 闭包
Python进阶(五)----内置函数Ⅱ 和 闭包 一丶内置函数Ⅱ ####内置函数#### 特别重要,反复练习 ###print() 打印输入 #sep 设定分隔符 # end 默认是换行可以打印到 ...
- 第二十五章 面向对象------封装、内置函数、反射、动态导入
1.封装 什么是封装? 1.对外部隐藏内部的属性,以及实现细节,给外部提供使用的接口 注意:封装有隐藏的意思,但不是单纯的隐藏 学习封装的目的:就是为了能够限制外界对内部数据的访问 python中属性 ...
- python_day21面向对象的进阶(反射,内置方法,)
# 两个内置函数 *# 反射 *****# 内置方法 *** # 类(定义) # 静态属性 类属性(变量) 直接写在类中,全大写 # 动态属性 方法(函数) self # 类方法 @classmeth ...
- Python之路(第二十七篇) 面向对象进阶:内置方法、描述符
一.__call__ 对象后面加括号,触发执行类下面的__call__方法. 创建对象时,对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()( ...
- 【老九学堂】【C语言进阶】内置函数补充
原型: 用法:#include 有些编译器需要#include 功能: 改变mem_address所指内存区域的大小为newsize长度. 说明: 如果重新分配成功则返回指向被分配内存的指针,否则返回 ...
- python中函数包括标准库函数吗_Python标准库:内置函数divmod(a, b)
本函数是实现a除以b,然后返回商与余数的元组. 如果两个参数a,b都是整数,那么会采用整数除法,结果相当于(a//b, a % b).如果a或b是浮点数,相当于(math.floor(a/b), a% ...
- learn_Day14 内置函数补充、反射、初识面向对象
内置函数 __import__()用于导入模块 getattr 用于寻找模块的指定对象 a = __import__('b') # b为模块名,b是字符串 ==>> 导入模块b并重新命名 ...
- python内置函数面向对象_Pyhton——面向对象进阶二:类的内置函数补充、描述符...
Pyhton--面向对象进阶二: 一.类的内置函数补充 1.isinstance(obj,cls)--检查obj是否是该类的对象 class Hoo: def __init__(self,name,t ...
- 面向对象进阶------内置函数 str repr new call 方法
__new__方法: 我们来讲个非常非常重要的内置函数和init一样重要__new__其实在实例话对象的开始 是先继承父类中的new方法再执行init的 就好比你生孩子 先要把孩子生出来才能对孩子 ...
最新文章
- WinCVS与CVSNT简明使用手则
- AngularJs出现错误Error: [ng:areq]
- 90后女科学家,四年完成清华大学硕博连读,解决多个世界级难题
- 史上最全的ECharts讲解与使用
- 斗地主AI算法——第十四章の主动出牌(3)
- 天然气压缩因子计算软件_徐秀芬等:天然气加气站压缩机组效率的计算方法
- 有没有比python更简单的语言排名_编程语言4种更快更简单实现Python数据可视化的方法...
- 20200910:力扣204周周赛题解上(Java/Python/Cpp)
- Java之戳中痛点 - (6)避免类型自动转换,例如两个整数相除得浮点数遇坑
- Answers To The Questions from GiGabyte
- Linux服务器多线程编程
- 表格相对引用和绝对引用及相互切换(复制单元格函数公式保持不变)
- 能不用事务就尽量别用
- 数据结构第一章概论习题及答案
- 打开IDEA遇到:The license has been cancelled
- java 四舍六入五成双_EXCEL实现四舍六入五成双修约规则的方法
- 产业赋能,平台先行——未来工业强国的典型特征
- Zynq实现分布式Fir滤波器
- 异次元发卡系统源码荔枝发卡V3.0
- package.json中private选项的作用
热门文章
- django 学习-13 Django文件上传
- mysql 基本操作和问题
- EmbeddedBrowser
- 在java中如何把字符串转换成时间格式?
- 使用Css隐藏超出容器宽度的文字,溢出部分用“...”表示
- 用Log Explorer恢复数据的基本操作
- 1106. Lowest Price in Supply Chain (25)-PAT甲级真题(dfs,bfs,树的遍历)
- 怎么看so文件是哪个aar引进来的_运城人才引进7月5号面试
- mybatis中 bit类型判断
- Go语言开发(九)、Go语言并发编程