• 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))
  • 相关阅读:
    数组字典
    字符串创建
    不可变数组
    数组
    纯净控制台
    可变字典
    数组Array
    id NSObject instanceType 区别
    可变字符串 插入,删除,替换,赋值
    查询字符串中某部分的字符串
  • 原文地址:https://www.cnblogs.com/yzxing/p/8876359.html
Copyright © 2020-2023  润新知