绑定: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 面向对象进阶 反射内置函数相关推荐

  1. python内置函数与闭包_Python进阶(五)----内置函数Ⅱ 和 闭包

    Python进阶(五)----内置函数Ⅱ 和 闭包 一丶内置函数Ⅱ ####内置函数#### 特别重要,反复练习 ###print() 打印输入 #sep 设定分隔符 # end 默认是换行可以打印到 ...

  2. 第二十五章 面向对象------封装、内置函数、反射、动态导入

    1.封装 什么是封装? 1.对外部隐藏内部的属性,以及实现细节,给外部提供使用的接口 注意:封装有隐藏的意思,但不是单纯的隐藏 学习封装的目的:就是为了能够限制外界对内部数据的访问 python中属性 ...

  3. python_day21面向对象的进阶(反射,内置方法,)

    # 两个内置函数 *# 反射 *****# 内置方法 *** # 类(定义) # 静态属性 类属性(变量) 直接写在类中,全大写 # 动态属性 方法(函数) self # 类方法 @classmeth ...

  4. Python之路(第二十七篇) 面向对象进阶:内置方法、描述符

    一.__call__ 对象后面加括号,触发执行类下面的__call__方法. 创建对象时,对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()( ...

  5. 【老九学堂】【C语言进阶】内置函数补充

    原型: 用法:#include 有些编译器需要#include 功能: 改变mem_address所指内存区域的大小为newsize长度. 说明: 如果重新分配成功则返回指向被分配内存的指针,否则返回 ...

  6. python中函数包括标准库函数吗_Python标准库:内置函数divmod(a, b)

    本函数是实现a除以b,然后返回商与余数的元组. 如果两个参数a,b都是整数,那么会采用整数除法,结果相当于(a//b, a % b).如果a或b是浮点数,相当于(math.floor(a/b), a% ...

  7. learn_Day14 内置函数补充、反射、初识面向对象

    内置函数 __import__()用于导入模块 getattr 用于寻找模块的指定对象 a = __import__('b')  # b为模块名,b是字符串 ==>> 导入模块b并重新命名 ...

  8. python内置函数面向对象_Pyhton——面向对象进阶二:类的内置函数补充、描述符...

    Pyhton--面向对象进阶二: 一.类的内置函数补充 1.isinstance(obj,cls)--检查obj是否是该类的对象 class Hoo: def __init__(self,name,t ...

  9. 面向对象进阶------内置函数 str repr new call 方法

    __new__方法: 我们来讲个非常非常重要的内置函数和init一样重要__new__其实在实例话对象的开始  是先继承父类中的new方法再执行init的  就好比你生孩子 先要把孩子生出来才能对孩子 ...

最新文章

  1. WinCVS与CVSNT简明使用手则
  2. AngularJs出现错误Error: [ng:areq]
  3. 90后女科学家,四年完成清华大学硕博连读,解决多个世界级难题
  4. 史上最全的ECharts讲解与使用
  5. 斗地主AI算法——第十四章の主动出牌(3)
  6. 天然气压缩因子计算软件_徐秀芬等:天然气加气站压缩机组效率的计算方法
  7. 有没有比python更简单的语言排名_编程语言4种更快更简单实现Python数据可视化的方法...
  8. 20200910:力扣204周周赛题解上(Java/Python/Cpp)
  9. Java之戳中痛点 - (6)避免类型自动转换,例如两个整数相除得浮点数遇坑
  10. Answers To The Questions from GiGabyte
  11. Linux服务器多线程编程
  12. 表格相对引用和绝对引用及相互切换(复制单元格函数公式保持不变)
  13. 能不用事务就尽量别用
  14. 数据结构第一章概论习题及答案
  15. 打开IDEA遇到:The license has been cancelled
  16. java 四舍六入五成双_EXCEL实现四舍六入五成双修约规则的方法
  17. 产业赋能,平台先行——未来工业强国的典型特征
  18. Zynq实现分布式Fir滤波器
  19. 异次元发卡系统源码荔枝发卡V3.0
  20. package.json中private选项的作用

热门文章

  1. django 学习-13 Django文件上传
  2. mysql 基本操作和问题
  3. EmbeddedBrowser
  4. 在java中如何把字符串转换成时间格式?
  5. 使用Css隐藏超出容器宽度的文字,溢出部分用“...”表示
  6. 用Log Explorer恢复数据的基本操作
  7. 1106. Lowest Price in Supply Chain (25)-PAT甲级真题(dfs,bfs,树的遍历)
  8. 怎么看so文件是哪个aar引进来的_运城人才引进7月5号面试
  9. mybatis中 bit类型判断
  10. Go语言开发(九)、Go语言并发编程