zoukankan      html  css  js  c++  java
  • 内置函数,反射,内置方法

    1,内置函数,1>isinstance()  2>issubclass()

    • 1.1>isinstance(),是判断对象所属类型,包括继承关系
    • isinstance(obiect,type)判断对象object是不是某某类型
    class A:
        pass
    class B(A):
        pass
    b = B()  # print(isinstance(b,B)),判断对象b是不是属于B类(b是子类B实例化的对象,那肯定是)
    • 1.2>issubclass(),是判断类与类之间的继承关系(即判断这2个之间是不是存在继承关系),得出的结果是True或者False
      • print(issubclass(B,A)).......................判断类B是不是继承类A,这时返回的是True
      • print(b,A)........................................此时报错,因为对象b和A没有继承关系,和B也不是继承关系
    • 1.3>isinstance和is的区别
    class Mystr(str):  #此时打印的是实例化对象空间里放了个"alex"
        pass
    
    
    ms = Mystr("alex")
    print(ms)  # 此时打印的是实例化对象空间里放了个"alex"
    print(type(ms) is str)  # type(ms)是指向对象子类的空间(内存地址)
    print(isinstance("alex", str))  # 判断"alex"是父类str

    2,反射:用字符串数据类型的变量来访问这个变量,反射的方法:getatter  hasatter   setatter    delatter

    • 格式:  命名空间.xxx == getatter(命名空间,"xxx")
    class Student:
        ROLE = "STUDENT"
    
        @classmethod
        def check_course(cls):
            print("查看课程")
    
        @staticmethod
        def login():
            print("登录")
    • 2.1>反射查看属性(通过类名去调用)
      • print(Student.ROLE)....................................普通查看类中静态属性的方法
      • print(getatter(Student,"STUDENT"))..................用getattr去查看静态属性的方法
    • 2.2>反射调用方法
      • Student.login()..........................普通调用方法
      • getattr(Student,"login")().........................使用getattr调用类中的函数
    • 2.3>方法,对象属性(通过对象去调用)
    class A:
        def __init__(self, name):
            self.name = name
    
        def func(self):
            print("in func")
    a = A("alex")
    print(a.name)
    print(getattr(a, "name"))  # 普通访问类的方法
    getattr(a, "func")()  #使用getattr放法访问类中的方法

    反射:

    hasattr,getattr
    
    类名,名字
    
      getattr(类名,"名字")
    
    对象名,名字
    
      getattr(类名,"名字")
    
    模块名,名字
    
      import   模块
    
      getattr(模块,名字)
    
    自己文件,名字
    
      import  sys
    
      getattr(sys.modules["main"],"名字")

    3,内置方法

    • 类中的特殊方法内置方法
    • 双下方法/魔术方法
    • 类中的每一个双下方法都有它特殊的意义
    • 3.1>__call__方法相当于  对象()
    class A :
        def __call__(self, *args, **kwargs):
            print("执行call方法了")
    
        def call(self):
            print("执行call方法")
    class B:
        def __init__(self, cls):
            print("在实例化之前做了一些事")
            self.a = cls()
            self.a()
            print("在实例化之后做了一些事")
    a = A()  # 实例化一个对象在后边加一个()就自动执行__call__方法:执行call方法了
    a()  # 调用call方法
    B(A)  # 实例化B类形成一个对象,把父类(A)的空间传给B类中的cls执行__init__方法
    • 3.2>__len__方法:内置函数和类的内置方法是有联系的,__len__是查找
    class Mylist:
        def __init__(self):
            self.lst = [1,2,3,4,5,6]
            self.age = 83
            self.name = name
        def __len__(self):
            print("执行__len__了")
            return len(self.__dict__)
    # 这的self.__dict__是查找对象中封装了几个属性,当换成self.lst时,
    # 就计算对象封装属性lst的长度,当后边跟一个self.name是查找name这个字符串的长度
    l = Mylist()
    print(len(l))
    • 3.3>__new__方法(构造方法),     __init__方法(初始化方法)
    class Single:
        def __new__(cls,*args,**kwargs)
            print("在new方法里")
            obj = object.__new__(cls)
            print("在new方法里",obj)
            return obj
        def __init__(self):
            print("在init方法里",self)

      • 3.3.1>在内存开辟一个空间,是属于对象的
      • 3.3.2>把对象的空间传给self,执行init
      • 3.3.3>将这个对象的空间返回给调用者
      • 3.3.4>在实例化一个对象,在__init__之前执行__new__方法来创建一块空间
    • 单类:如果一个类,从头到尾只能有一个实例,说明从头到尾就开辟了一块空间(有且只有一个空间),name这个类就是单例类
    • 单例类:
    class Single:
        __ISINSTANCE = None
        def __new__(cls,*args,**kwargs):
            if not cls__ISINSTANCE:
                cls.__ISINSTANCE = object.__new__(cls)
                return cls.__new__ISINSTANCE
        def __init__(self,name,age):
            self.name = name 
            self.age = age
            s1 = Single("alex",18)
            s2 = Single("taibai",40)
            print(s1.name)
            print(s2.name)
            print(s1,s2)

    • 第一次输进去的"alex"被"taibai"覆盖掉了
    • 3.4>__str__方法  
    class Student:
    def __str__(self):
    return '%s %s %s'%(self.school,self.cls,self.name)

    def __init__(self,name,stu_cls):
    self.school = 'oldboy'
    self.name = name
    self.cls = stu_cls

    he = Student('hezewei','py14')
    huang = Student('huangdongyang','py14')
    print('学生1 : %s'%he)  #
    # 内置的数据类型,内置的类,相当于执行__str__
    # print一个对象相当于调用一个对象的__str__方法
    # str(obj),相当于执行obj.__str__方法
    # '%s'%obj,相当于执行obj.__str__方法

     

     
  • 相关阅读:
    JavaScript丨数组元素反转
    Executor框架浅析
    索引相关
    关系型数据库
    Cookie和Session
    HTTP和HTTPS
    TCP,UDP,HTTP
    OSI模型
    剑指Offer19
    剑指Offer03
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/9398669.html
Copyright © 2011-2022 走看看