• 面向对象高级


    面向对象进阶

    isinstance(obj,cls)检查obj是否是类cls的对象

    class Foo(object):
        pass
    obj = Foo()
    print(isinstance(obj,Foo))
    

    issubclass(sub,super)检查sub类是否是super类的派生类

    class Foo(object):
        pass
    class Bar(Foo):
        pass
    print(issubclass(Bar,Foo))
    

    反射

    1、什么是反射??

    主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。
    2、python中面向对象的反射:通过字符串的形式操作对象的属性。python中一切皆对象,都可以使用反射。

    四个可以实现反射的函数--适用与类和对象

    hasattr(object,name)
    ##判断object中有没有一个name字符串对应的方法或属性,返回布尔值
    class test():
        name = 'egon'
        def run(self):
            return 'helloworld'
    
    t = test()
    print(hasattr(t,'run'))
    print(hasattr(t,'helloworld'))
    
    -----------------------------
    getattr(object,name) 
    #获取对象object的属性或者方法
    
    class teat():
        name = 'egon'
        def run(self):
            return 'helloworld'
    
    t = teat()
    getattr(t,'name') #获取name属性。存在就打印出来
    getattr(t,'run') #获取run方法,存在就打印方法的内存地址,加括号可以直接运行
    getattr(t,'age') #获取一个不存在的属性。报错
    getattr(t,'age','18') # 若属性不存在,返回一个默认值
    
    ------------------------------
    
    # setattr(object,name,value)
    #给对象的属性赋值,如属性不存在,就先创建再赋值
    class test():
        name = 'xiaohua'
        def run(self):
            return 'helloword'
    
    t = test()
    hasattr(t,'age') #判断属性是否存在
    setattr(t,'age','18') #为属性赋值,没有返回值
    hasattr(t,'age') #属性存在来
    
    -----------------------------------------------
    def delattr(x, y): # real signature unknown; restored from __doc__
        """
        Deletes the named attribute from the given object.
    
        delattr(x, 'y') is equivalent to ``del x.y''
        """
        pass
    

    四种函数的实例

    class BlackMedium:
        feature = 'Ugly'
        def __init__(self,name,addr):
            self.name = name
            self.addr = addr
    
        def sell_house(self):
            print('%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼' %self.name)
    
        def rent_house(self):
            print('%s 黑中介租房子啦,傻逼才租呢' %self.name)
    
    b1 = BlackMedium('坐而论道','起而行之')
    
    #监测是否含有某属性
    print(hasattr(b1,'name'))
    print(hasattr(b1,'sell_house'))
    
    #获取属性
    n = getattr(b1,'name')
    print(n)
    func = getattr(b1,'rent_house')
    func()
    print(getattr(b1,'aaaaa','不存在啊'))
    
    #设置属性
    setattr(b1,'sd',True)
    setattr(b1,'show_name',lambda self:self.name+'sb')
    print(b1.__dict__)
    print(b1.show_name(b1))
    
    #删除属性
    delattr(b1,'addr')
    delattr(b1,'show_name')
    delattr(b1,'show_nameall') #不存在,则报错
    

    类也是对象

    class Foo(object):
        staticField = 'old boy'
    
        def __init__(self):
            self.name = 'xiaoming'
    
        def func(self):
            return 'func'
    
        @staticmethod
        def bar():
            return 'bar'
    
    print(getattr(Foo,'staticField'))
    print(getattr(Foo,'func'))
    print(getattr(Foo,'bar'))
    

    反射当前模块成员

    import sys
    
    def s1():
        print('s1')
    
    def s2():
        print('s2')
    
    this_module = sys.modules[__name__]
    
    print(hasattr(this_module,'s1'))
    print(getattr(this_module,'s2'))
    
  • 相关阅读:
    NGINX原理分析 之 SLAB分配机制
    graphviz
    使用git Rebase让历史变得清晰
    An Implementation of Double-Array Trie
    转录组差异表达分析小实战(一)
    简单使用limma做差异分析
    简单使用DESeq2/EdgeR做差异分析
    简单使用DESeq做差异分析
    HISAT,sTRINGTIE,ballgown三款RNA-seq信息分析软件
    转录组的组装Stingtie和Cufflinks
  • 原文地址:https://www.cnblogs.com/guodengjian/p/9188805.html
Copyright © 2020-2023  润新知