zoukankan      html  css  js  c++  java
  • 面向对象—反射

    内置函数:
    1.isinstance:判断一个对象和一个类有没有血缘关系
    class A:pass
    class B(A):pass
    a = B()
    print(isinstance(a,B)) #True
    print(isinstance(a,A)) #True
    print(type(a) is B) #True
    print(type(a) is A) #False
    2.issubclass(子类名,父类名):检测继承关系,返回True说明与继承关系
    class A:pass
    class B(A):pass
    class C(B):pass
    print(issubclass(C,B))#True
    print(issubclass(C,A))#True

     反射

    反射:通过字符串的形式操作对象相关的属性,使用字符串数据类型的变量名访问一个命名空间中的名字,找一个属性直接就可以找到这个属性的值,找一个方法找到的是这个方法的内存地址。

    反射的4个内置函数:

    1.hasatter:判断一个命名空间里是否有一个属性或方法

    class A:
        role = 'Person'
        def func(self):
            print('*'*self)
    
    print(hasattr(A,'r')) # False
    print(hasattr(A,'role')) # True
    print(hasattr(A,'func')) # True
    ret = input('>>>')
    if hasattr(A,ret):
        print(getattr(A,ret))
    if hasattr(A,ret):
        func = getattr(A,ret)
        func(12)
    2.getatter:从一个命名空间里获取一个属性或方法的值,方法需要调用。
    class A:
        role = 'Person'
        def func(self):
            print('*'*self)
    ret = input('>>>')
    print(getattr(A,'role')) #从A的命名空间里找一个属性,直接可以找到这个属性的值
    f = getattr(A,'func');f(3) #从A的命名空间里找一个方法,找到的是这个方法的内存地址
    A.func(1)
    • 类使用类命名空间中的名字:getattr(类名,'名字')
    • 对象使用对象能用的方法和属性:getattr(对象名,'名字')
    • class A:
          role = 'Person'
          def __init__(self):
              self.money = 500
          def func(self):
              print('*'*5)
      a = A()
      getattr(a,'func')()
      print(getattr(a,'money')) #getattr(对象名,'名字')
    • 模块使用模块中的名字:getattr(模块名,'名字')
    • import time
      time.time()
      print(time.time)
      print(getattr(time,'time'))
      
      import os
      getattr(os,'rename')('user','user_info')
    • 自己所在的模块中使用自己的名字:impoart sys    getattr(sys.modules['__main__'],名字)
    • def login():
          print('执行login功能')
      def register():
          print('执行register功能')
      
      import sys #和python解释器相关的内容都在sys模块里
      print(sys.modules['__main__']) # 找到自己所在的模块(py文件)
      func = input('>>>')
      getattr(sys.modules['__main__'],func)()

     3.setatter:增加和修改

     4.delatter:删除

    class A:
        def __init__(self,name):
            self.name = name
        def wahaha(self):
            print('wahahaha')
    
    a = A('alex')
    # a.age = 18
    # print(a.__dict__)
    setattr(a,'age',18) # 增加一个属性
    print(a.__dict__) # {'age': 18, 'name': 'alex'}
    setattr(a,'name','taibao') # 修改一个属性
    print(a.__dict__)# {'age': 18, 'name': 'taibao'}
    delattr(a,'age') #删除一个属性
    print(a.__dict__) #{'name': 'taibao'}

     内置方法

    len()内置方法和内置函数__len__是对应的关系

    class A:
        def __init__(self,name,age,sex,cls):
            self.name = name
            self.age = age
            self.sex = sex
            self.cls = cls
        def __len__(self):
            return len(self.__dict__)
    
    a = A('alex',18,'man',2)
    print(len(a)) # 4
    a.hobby = '烫头'
    print(len(a)) # 5

    hash()内置方法和内置函数__hash__是对应的关系

    class A:
        def __init__(self,name,age,sex,cls):
            self.name = name
            self.age = age
            self.sex = sex
            self.cls = cls
        def __hash__(self):
            return 1
    a = A('alex',18,'man',2)
    print(hash(a)) # 1
  • 相关阅读:
    哈希表
    fastcgi 分布式
    环形队列实现
    队列--双链表实现
    lighttpd fastcgi的搭建
    vim 常用命令
    命令行解析getopt_long
    规范打log
    apt-get &dpkg
    Linux syslog 学习
  • 原文地址:https://www.cnblogs.com/facestore/p/8875462.html
Copyright © 2011-2022 走看看