zoukankan      html  css  js  c++  java
  • 4-18 面向对象的进阶

    1,isinstance

    判断一个类和另一个类有没有(血缘)关系。type只能检测数据类型

    class A:pass
    class B(A):pass
    a = A()
    print(isinstance(a,A))
    print(isinstance(a,B))
    class A:pass
    class B(A):pass
    a = A()
    print(type(a)is A)
    print(type(a)is B)

    2,issubclass 检测两个类有没有继承关系

    class B:pass
    class C(B):pass
    class D(C):pass
    print(issubclass(C,D))
    print(issubclass(D,C))
    print(issubclass(B,C))
    print(issubclass(C,B))
    print(issubclass(D,B))
    # issubclass(子类名,父类名) 如果返回True,说明有继承关系

    3,最重要的反射

    第一种:使用反射得到类的命名空间的名字  getattr()  和  hasattr ()

    getattr()  从命名空间空间中得到这个名字对应的值。

    hasattr()  判断一个命名空间中有没有这个名字 有True 无Flase

    getaatr(类名,'名字')

    class A:
        role = 'Person'
        def func(self):
            print('*'*self)
    print(hasattr(A,'r'))
    print(hasattr(A,'role'))
    print(hasattr(A,'func'))
    ret = input('>>>')
    if hasattr(A,ret):
        print(getattr(A,ret))     # getattr从A的命名空间里找一个属性 ,属性不存在会报错
    if hasattr(A,ret):
        func = getattr(A,ret)
        func(1)

    第二种:反射得到对象使用的方法和属性

    getattr(对象名,'名字')

    class Teacher:
        role = 'person'
        def __init__(self,name):
            self.name = name
            self.money = 500
        def func(self):
            print('好好努力')
    alex = Teacher('alex')
    print(getattr(alex,'name'))
    getattr(alex,'func')()

    第三种:使用模块中的模块名字

    getattr(模块名,'名字')

    import os;getattr(os,'rename')('user','user_info')
    import time
    time.time()
    print(time.time())
    print(getattr(time,'time')())

    第四种:当前自己的模块使用自己的名字

    import sys    getattr(sys.modules['__main__'],名字)

    def login():
        print('执行login功能')
    
    def register():
        print('执行register功能')
    
    import sys  # 和python解释器相关的内容都在sys里
    print(sys.modules['__main__'])
    func = input('>>>')
    if hasattr(sys.modules['__main__'],func):
        getattr(sys.modules['__main__'],func)()

    5,反射的内置函数

    getattr,hasattr,setattr,delattr.

    getattr()  从命名空间空间中得到这个名字对应的值。

    hasattr()  判断一个命名空间中有没有这个名字 有True 无Flase

    setattr()  增加和改对象属性和方法

    delattr() 删除对象的属性和方法

    class A:
        def __init__(self,name):
            self.name = name
        def wahaa(self):
            print('ssdas')
    a = A('alex')
    a.wahaa()
    getattr(a,'name')
    # a.age = 18
    # print(a.__dict__)
    setattr(a,'age',18)
    setattr(a,'name','egon')
    print(a.__dict__)
    delattr(a,'name')
    print(a.__dict__)
    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)

     6,内置方法__len__和__hash__

    有一个内置函数和内置方法len()是唯一对应的关系

    class A:
        def __init__(self,name,age,sex,hobby):
            self.name = name
            self.age = age
            self.sex = sex
            self.hobby = hobby
        def __len__(self):
            return len(self.__dict__)
    alex = A('alex',33,'male','girl')
    egon = A('egon',23,'female','抽烟')
    alex.money = 200
    print(len(alex))

    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 0
    a1 = A('alex',81,'不详',2)
    print(hash(a1))
  • 相关阅读:
    Aurora 数据库支持多达五个跨区域只读副本
    Amazon RDS 的 Oracle 只读副本
    Amazon EC2 密钥对
    DynamoDB 读取请求单位和写入请求单位
    使用 EBS 优化的实例或 10 Gb 网络实例
    启动 LAMP 堆栈 Web 应用程序
    AWS 中的错误重试和指数退避 Error Retries and Exponential Backoff in AWS
    使用 Amazon S3 阻止公有访问
    路由表 Router Table
    使用MySQLAdmin工具查看QPS
  • 原文地址:https://www.cnblogs.com/yzxing/p/8876359.html
Copyright © 2011-2022 走看看