首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

面向对象编程(OOP) -3

面向对象编程(OOP) -3

静态语言VS动态语言

    对于静态语言(如JAVA)来说,如果需要传入Animal类型,那么你传入的必须是Animal类或者是它的子类,,否则无法调用run()方法
    对于Python这样的动态语言来说,不一定需要传入Animal类型.我们只需要保证它传入的类型中包含run()方法
    这就是动态语言的"鸭子类型",它不要求严格的继承体系,一个对象"只要看起来像只鸭子,走起路来像只鸭子,那么它就可以被当做鸭子"
    动态语言的鸭子类型特点决定了继承不像是静态语言那样是必须的.

获取对象信息

    我们拿到一个对象引用的时候,如何知道这个对象是什么类型,有什么方法呢?
    使用type() 判断对象的类型

    判断基本类型可以直接写int str等

    对于class的继承关系来说,type()判断很不方便,我们要判断class的类型,可以使用isinstance()函数, isinstance()函数可以判断一个对象是否是该类本身.或者是否位于该类的父继承链上

    # object--->Animal--->Dog--->Husky 继承关系
    a = Animal()
    d = Dog()
    h = Husky()
    print(isinstance(h, Husky))
    print(isinstance(h, Dog))

    能用type()判断的也基本可以用isinstance()判断

    print(isinstance('a', str))
    print(isinstance('b', int))

    并且可以判断一个变量是否是某些数据类型中的一种

    # 判断是否是list或tuple中的一种
    print(isinstance([1, 2, 3], (list, tuple)))
    print(isinstance((1, 2, 3), (list, tuple)))

    总是优先使用isinstance()函数,把指定类型及其子类一网打尽
    dir() 获取一个对象的所有属性和方法,在python中任何一种数据类型都可看做是一个对象.它返回的是一个包含字符串的list.


    类似xxx的属性和方法在Python中都是有特殊用途的,

    # 比如__len__方法返回长度,在Python内部,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__方法
    print(len('abc'))
    print('abc'.__len__)

    把属性和方法列出来是不够的,配合hasattr()是否有某个属性或者方法 getattr() 获取某个属性或者方法 setattr() 设置某个属性或者方法为什么


    # 我们希望从文件流fp中读取图像,我们要首先判断fp对象是否有read()方法,如果存在,该对象就是一个流,如果不存在,该对象就无法读取,hasattr()就派上用场了
    def readImage():
        if hasattr(fp, 'read'):
            return readData(fp)
        return None
    # 请注意在Python这类动态语言中,根据鸭子模型,有read()方法,不代表该fp对象就是一个文件流,它有可能是一个网络流,也有可能是内存中的一个字节流,但是只要是read()方法返回的是有效的图像数据,就 不影响读取图像的功能
返回列表