• python 面向对象_多态、内置方法、反射


    内容:

    • 1.接口思想
    • 2.抽象类思想
    • 3.多态
    • 4.内置方法
    • 5.反射

    1.接口思想

    建立关联的桥梁,方便管理代码
    接口类:用来定义功能的类,位继承它的子类提供功能
    该类的功能方法一般不需要实现体,实现体由继承它的子类自己实现
    

    2. 抽象类思想

    抽象父类:拥有抽象方法(子类共有的方法,但是父类不能有具体的实现体)的父类
    抽象方法:方法名是具体的,但实现体是抽象的(在子类中重写来具象化)
    

    3. 多态

    3.1 什么是多态
    多态指的是同一种/类事物的不同形态
    
    3.2 为何要用多态
    多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象
    多态性的精髓:统一
    
    多态的体现:功能或需求,需要父类的对象,可传入父类对象或任意子类对象均可
    有抽象方法的父类,无法实例化
    
    常见的多态及其带来的好处:
    python中多种数据类型:字符串、列表、字典、元组等,都拥有通用的使用方法
    例如:
    """
    """s = 'hello'
    l = [1, 2, 3, 4]
    t = (1, 2, 54, 4)
    
    # 不同类型的数据都可以使用
    print(len(s))
    print(len(l))
    print(len(t))
    
    # 内部使用的就是多态的思想
    s1 = s.__len__()
    l1 = l.__len__()
    t1 = t.__len__()
    
    print(s1)
    print(l1)
    print(t1)
    
    3.3 鸭子类型
    1.规定有什么属性及什么方法的对象叫鸭子
    2.能提供出规定的属性与方法的对象就是鸭子
    
    解释2:(抽象的思想) 
        两个类没有继承同一个类(都不继承类),但是二者含有相同的功能,
        就称这两个类是鸭子类型
    
    “这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:
    “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。””
    
    # 二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
    class TxtFile:
        def read(self):
            pass
    
        def write(self):
            pass
    
    
    class DiskFile:
        def read(self):
            pass
    
        def write(self):
            pass
    

    4.内置方法

    4.1 isinstance(obj, cls) 和 issubclass(sub, super)
    # isinstance(obj, cls) 检查 obj 是否是类 cls 的对象
    
    class Foo(object):
        pass
    obj = Foo()
    
    isinstance(obj, cls)
    
    # issubclass(sub, supper) 检查 sub 类是否是 super 类的派生类
    
    class Foo(object):
        pass
    class Bar(Foo):
        pass
    issubclass(Bar, Foo)
    
    4.2 str
    在对象被打印时自动触发,可以用来定义对象被打印时的输出信息
    
    # 注意:必须返回一个字符串类型的值,
    
    class People:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def __str__(self):
            # print('run..........')
            return '<name:%s age:%s>' % (self.name, self.age)
    
    obj1 = People('zhangsan', 18)
    print(obj1)  # print(obj1.__str__())
    
    obj2=list([1,2,3])
    print(obj2)
    
    4.3 del
    在对象被删除时先自动触发该方法,可以用来回收对象以外其他相关资源,比如系统资源
    
    class Foo:
        def __init__(self, x, filepath, encoding='utf-8'):
            self.x = x
            self.f = open(filepath, 'rt', encoding=encoding)
        def __del__(self):
            print('run.....')
            # 回收对象关联的其他资源
            self.f.close()
    
    obj = Foo(1, 'a.txt')
    # del obj
    print('主===========>')
    
    4.4 call
    在对象被调用时会自动触发该方法,可以用来???
    class Foo:
        def __init__(self, x, y):
            self.x = x
            self.y = y
        
        def __call__(self, *args, **kwargs):
            print(self, args, kwargs)
            print("----------------------------------")
    
    obj = Foo(1, 2)
    obj(1, 2, a=3, b=4)  # obj.__call__(obj,1,2,a=3,b=4)
    

    5. 反射:通过字符串来反射/映射到对象/类的属性上

    hasattr()
    getattr()
    setattr()
    delattr()
    
    class People:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def run(self):
            print('%s is running' % self.name)
    
    obj = People('lisi', 18)
    print(obj.__dict__)  # {'age': 18, 'name': 'lisi'}
    
    print(hasattr(obj, 'name'))  # 'name' in obj.__dict__
    print(getattr(obj, 'name'))  # obj.__dict__['name']
    print(getattr(obj, 'xxx', '没找到啊'))  # obj.__dict__['xxx']
    # 没有这个属性,会报错, 第三个参数为默认值,当找不到的时候,返回第三个参数内容
    
    delattr(obj, 'name')
    print(obj.__dict__)  # {'age': 18}
    
  • 相关阅读:
    Codeforces Round #260 (Div. 2)
    面试题:给定数组a,找到最大的j-i, 使a[j]>a[i]
    ssh自动输入密码脚本 切换目录脚本
    make工作时的执行步骤
    Codeforces Round #259 (Div. 2)
    Codeforces Round #258 (Div. 2)
    如何在半径为1的圆中随机选取一个点
    面试中常问的有关随机选取k个数的总结
    topcoder SRM 628 DIV2 BracketExpressions
    topcoder SRM 628 DIV2 BishopMove
  • 原文地址:https://www.cnblogs.com/xt12321/p/10750969.html
Copyright © 2020-2023  润新知