• python 内置函数的补充 isinstance,issubclass, hasattr ,getattr, setattr, delattr,str,del 用法,以及元类


    isinstance   是 python中的内置函数 , isinstance()用来判断一个函数是不是一个类型

    issubclass  是python 中的内置函数,  用来一个类A是不是另外一个类B的子类   issubclass(子类,父类)

    class Foo:
        pass
    
    obj=Foo()
    print(isinstance(obj,Foo))#  判断实例化的foo是不是这个类
    #判断结果为True

    print(isinstance(obj,Foo)) 它就等同于
    ======》》》print(type(obj) is Foo) #obj的类是Foo

    再举个例子:

    print(isinstance('abc',str))   字符串的类是 str
    print(isinstance(123,int))      数字的类是 int

    
    

    反射:通过字符串来操作类与对象的属性,  这种操作成为反射

    有四个   hasattr         getattr          setattr       delattr  

    这四个的用法 都为hasattr /setarr/getattr/delattr (类名,‘字符串’)类名后面加的都是字符串
     
    class People:
        country ='china'
        def __init__(self,name):
            slef.name=name
        def tell(self):
            print('%s is aaa'%self.name)
    
    obj=People('egon')
    
    #1、hasattr  判断有没有这个属性
    print(hasattr(People,'country'))  #True
    ====>> 等同于
     print('country' in People.__dict__)
    
    
    #2、getattr  函数属于内置函数, 可以通过函数名获取
    
    x=getattr(People,'country')
    print(x)    #打印结果  China
    
    若是获取的类里没有这个属性  则在字符串后加个 None  不然的话会报错
    
     x=getattr(People,'country1',None)
     print(x)
    
    
    #3、setarr  通过这个函数来设置属性 添加属性
    
    setattr(People,'x',111)
    print(People.x)  
    #打印结果为  111
     
    #4、delattr  用来删除对象的属性
    delattr(People,"country")
    print(People.__dict__)
    
    #{'__module__': '__main__', '__init__': <function People.__init__ at 0x00000138FC835048>, 'tell': <function People.tell at 0x00000138FC8350D0>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
       在来看  country 这个属性已经删掉了

    __str__ 方法:如果要把一个类的实例 变成str,就需要实现特殊方法__str__(),下面说 怎么用:

    我想要拿到egon的个人信息  姓名年龄以及性别 要是按照如下就很难拿到
    
    class People:
        def __init__(self,name,age,sex):
            self.name =name
            self.age=age
            self.sex=sex
    
    obj=People('egon',18,'male')
    print(obj)
    
    #打印结果
    <__main__.People object at 0x0000021FCE461B00>
    
    
    要是拿到信息 就地像以下方法拿到
    print(obj.name)
    print(obj.age)
    print(obj.sex)
    #打印结果
    egon
    18
    male
    这样就感觉比较复杂  可以在类内部添加一个__str__ 函数 试试呢
    
    
    
    class People:
        def __init__(self,name,age,sex):
            self.name =name
            self.age=age
            self.sex=sex
    
        def __str__(self):
            return '名字:%s,年龄:%s,性别:%s'%(self.name,self.age,self.sex)
    
    obj=People('egon',18,'male')
    print(obj)
    #打印结果
    名字:egon,年龄:18,性别:male

    __del__方法  删除

    当对象在内存中被释放时, 自动触发执行

    如果产生的对象仅仅只是在python程序级别的(用户级), 那么无需定义__del__,如果产生的对象的同时 还会像操作系统发起系统调用,即一个对象有用户级与内核级两种资源, 比如(打开一个文件, 创建一个数据库连接,)则必须在清楚对象的同时 回收系统资源 这就用到了__del__.

    class Foo:
        def __del__(self):
            print('执行我了’)
    
    f1=Foo()
    del f1
    print('------->')
    
    #输出结果
    执行我了
    ------->

    元类:元类就是帮你创建类的‘家伙‘,在python中, 类也是对象,这样的对象就是通过袁磊创建的, 元类就是‘类的类’。之前提到的type实际上就是元类, 在python中所有的类都是用type创建的。到此我们也能够立即为什么说在python中一切皆对象了吧,int,string,function,以及class 

    所有的多少对象 ,他们都能够从一个类中创建。

    2、用内置的元类type,来实例化得到我们的类
    class_name='Chinese'       #创建类名
    class_bases=(object,)     #定义父类
    class_body="""         #定义类的特征与属性等代码体
    country="China"
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def speak(self):
        print('%s speak Chinese' %self.name)
    """
    class_dic={}       #目前类的属性里的名称空间名字都还为空    
    exec(class_body,{},class_dic)   #exec 括号里面是代码体,然后是全局名称空间里的名称, 再然后是局部名称空间里的名称,全局的名称空间没有, 局部的名称空间会在类里产生。 
    
    类的三大要素
    print(class_name,class_bases,class_dic)  #类的三大要素,类名。父类,已经类的属性(名称空间包括变量以及函数)
    
    Chinese=type(class_name,class_bases,class_dic)   #创建类
    print(Chinese)
    
    p=Chinese('egon',18,'male')
    print(p.name,p.age,p.sex)

    __call__:  调用对象 会自动触发对象下的绑定方法__call__的执行,

    然后将对象本身当做第一个参数传给self,将调用对象时 括号内的值传给*args,**kwargs

    def __call__(self,*args,**kwargs):

      print('__call__'args,kwargs)

  • 相关阅读:
    【LOJ】#2888. 「APIO2015」巴邻旁之桥 Palembang Bridges
    【AtCoder】ARC099题解
    【LOJ】#2265. 「CTSC2017」最长上升子序列
    【LOJ】#2264. 「CTSC2017」吉夫特
    【AtCoder】AGC028 (A-E)题解
    【AtCoder】ARC100 题解
    【AtCoder】ARC101题解
    【AtCoder】AGC026 题解
    【LOJ】 #2308. 「APIO2017」商旅
    【BZOJ】3456: 城市规划(多项式求ln)
  • 原文地址:https://www.cnblogs.com/lx3822/p/8867598.html
Copyright © 2020-2023  润新知