• 0418 面向对象进阶 反射内置函数


    绑定:
    class
    A: def func1(self):pass # 对象与方法之间的绑定 def func4(self): pass # 对象与方法之间的绑定 @classmethod def func2(cls): pass # 类与方法之间的绑定 @staticmethod def 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:pass
    class B(A):pass
    class C(B):pass
    a=A()
    b=B()
    c=C()
    print(isinstance(c,B)) True
    print(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))  True
    print(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')) 100
    getattr(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 = name def 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)
     
  • 相关阅读:
    C#自定义控件的开发:Pin和Connector
    C# 调用第三方DLL完整实例
    利用微软Speech SDK 5.1开发语音识别系统主要步骤
    如何在Android中使用OpenCV
    VS 2012单元测试和测试资源管理器
    .NET Reflector插件FileDisassembler还原源码
    根据powerdesigner的OO模型生成C#代码
    SQLServer2008设置开启INTERNET远程连接
    Kudu-压缩
    kudu的读取数据流程
  • 原文地址:https://www.cnblogs.com/Mr-Murray/p/8875868.html
Copyright © 2020-2023  润新知