zoukankan      html  css  js  c++  java
  • 多态

    多态

    官方解释:多个不同类的对象可以响应同一个方法,产生不同的结果

    概念

    强调:多态不是一种特殊的语法,而是一种状态,特性

    一种事物具备多种不同形态

    例如: 水 固态 液态 气态

    好处

    对于使用者大大降低了使用难度

    我们之前写的USB接口下的鼠标,键盘,就属于多态

    实现多态

    接口,抽象类,鸭子类型,都可以写出具备多态的代码,最简单的就是鸭子类型

    案例:

    '''
    鸡 鸭 鹅 都会下蛋,虽然下的蛋不同
    下达一个下蛋的指令它们都能执行,即它们拥有相同的方法
    '''class J:
        def egg(self):
            print('鸡蛋')
    ​
    class Y:
        def egg(self):
            print('鸭蛋')
    ​
    class E:
        def egg(self):
            print('鹅蛋')
    ​
    j = J()
    y = Y()
    e = E()
    # 利用函数 调用它们相同的方法,产生不同的结果
    def eggs(obj):
        obj.egg()
    ​
    eggs(j)
    eggs(y)
    eggs(e)

    isinstance

    判断一个对象是否是某个类的实例

    参数1 : 要判断的对象

    参数2 : 要判断的类型

    def num(a, b):
        if isinstance(a, int) and isinstance(b, int):
            return a + b
        return None
    ​
    print(num(20, 50))

    issubclass

    判断一个类是否是类一个类的子类

    参数1 : 子类

    参数2 : 父类

    class Animal:
        def eat(self):
            print('')
    ​
    class Pig(Animal):
        def eat(self):
            print('from pig')
    ​
    class Tree:
        def eat(self):
            print('光合作用')
    ​
    def mange(obj):
        if issubclass(type(p), Animal):
            obj.eat()
        else:
            print('非动物')
    ​
    p = Pig()
    ​
    t = Tree()
    ​
    mange(p)
    mange(t)

     

    类中的魔法函数

    __str__

    __str__ 会在对象转换为字符串时,转换结果就是这个函时放入返回值
    使用场景: 我们可以利用该函数来自定义对象的打印格式
    # __str__
    class A:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    ​
        def __str__(self):
            return '这是A类的对象,name:%s, age:%s'%(self.name, self.age)
    ​
    a = A('xx', 20)
    print(a)  # >>> 这是A类的对象,name:xx, age:20

    __del__

    执行时机: 手动删除对象时立马执行,或是程序运行结束时也会自动执行
    使用场景: 当你的对象再使用过程中,打开了不属于解释器的资源,文件,端口
    # __del__
    class FileTool:
        def __init__(self, path):
            self.path = open(path, 'r', encoding='utf-8')
    ​
        def read(self):
            return self.path.read()
    ​
        def __del__(self):
            self.path.close()
    ​
    f = FileTool('a.txt')
    f.read()
    del f  # 自动执行 __del__ 函数

    __call__

    执行时机: 在调用对象时自动执行(即对象加括号)
    # __call__
    class A:
        def __call__(self, *args, **kwargs):
            print('run call')
            print(args)
            print(kwargs)
    ​
    a = A()
    a(10, x=100)
    >>>
    run call
    (10,)
    {'x': 100}

    slots

    该属性是一个类属性,用于优化对象内存占用
    优化原理:将原本不固定的属性数量变的固定了
    这样的解释器就不会为这个对象创建名称空间,所以__dict__也没了
    从而达到减少内存开销的效果
    当内中出现了slots 时,这个类的对象无法再添加新的属性
    class A:
        __slots__ = ['name']
        def __init__(self, name):
            self.name = name
            print(self.__dict__)  # 报错 不存在 __dict__
    ​
    a = A('xx')
    a.age = 20  # 报错 无法添加
    print(a.__dict__)  # 报错 不存在 __dict__

    getattr setattr delattr

    getattr 用点访问属性时 如果属性不存在时执行
    setattr 用点访问属性时
    delattr del 对象.属性 删除属性时执行
    class A:
        # 对象添加属性的原理
        def __setattr__(self, key, value):
            self.__dict__[key] = value
            print('执行了 __setattr__')
    ​
        # 对象删除属性的原理
        def __delattr__(self, item):
            self.__dict__.pop(item)
            print('执行了 __delattr__')
    ​
        def __getattr__(self, item):
            print('执行了 __getattr__')
            return 1
        #
        def __getattribute__(self, item):
            print('执行了 __getattribute__')
            # return self.__dict__[item]
            return super().__dict__[item]
    ​
    a = A()
    a.name = 'xx'del a.name
    ​
    print(a.name)

    [ ] 的实现原理

    getitem setitem delitem

    任何符号都会被解释器解释称特殊含义,例如:(),[ ]

    getitem 当你用中括号取获取属性时 执行
    setitem 当你用中括号设置属性时 执行
    delitem 当你用中括号删除属性时 执行
    class A:
    ​
        def __getitem__(self, item):
            print('执行了 __getitem__')
            return self.__dict__[item]
    ​
        def __setitem__(self, key, value):
            print('执行了 __setitem__')
            self.__dict__[key] = value
    ​
        def __delitem__(self, key):
            print('执行了 __delitem__')
            del self.__dict__[key]
    ​
    a = A()
    ​
    a['name'] = 'xx'
    print(a['name'])
    del a['name']
    ​

    运算符重载

    当我们在使用某个符号时,python解释器都会为这个符号定义一个含义,同时调用对应的处理函数,当我们需要自定义对象的比较规则时,就可在子类中覆盖 大于 等于 等一系列方法...

    案例:

    原本自定义对象无法直接进行大小的比较,我们可以自动应以运算符来实现,让自定义对象也支持比较运算

    __gt__(self, other)  大于
    __lt__(self, other) 小于
    __eq__(self, other) 等于

    # other 是另一参与比较的对象
    # 大于和小于只要实现一个即可,符号如果不同,解释器会自动交换两个对象的位置
    lass Student:
        def __init__(self, name, age, height):
            self.name = name
            self.age =age
            self.height = height
    ​
        def __gt__(self, other):
            return self.age > other.age
    ​
        def __lt__(self, other):
            return self.age < other.age
    ​
        def __eq__(self, other):
            if self.age == other.age and self.height == other.height:
                return True
            return False
    ​
    stu1 = Student('xx', 20, 175)
    stu2 = Student('yy', 22, 175)
    ​
    print(stu1 > stu2)  # 自动调用__gt__方法  False
    print(stu1 < stu2)  # 自动调用__lt__方法  True
    print(stu1 == stu2)  # 自动调用__eq__方法 False

    迭代协议

    迭代器是指具有__iter__和__next__的对象
    我们可以为对象增加这两个方法来让对象编程以迭代器
    class MyRange:
        def __init__(self, start, end, step=1):
            self.start = start
            self.end = end
            self.step = step
    ​
        def __iter__(self):
            return self
    ​
        def __next__(self):
            a = self.start
            self.start += self.step
            if a < self.end:
                return a
    ​
            else:
                raise StopIteration
    ​
    for i in MyRange(1, 10):
        print(i)

     

    上下文管理

    上下文 context

    这个概念属于语言科学,指的是一段话意义,要参考当前的场景,即上下文

    在python中,上下文可以理解为是一个代码区间,一个范围,例如 with open 打开的问价仅在这个上下文中有效

    涉及到的两个方法

    enter

    表示今日上下文

    exit

    表示退出上下文

    当执行with语句时,会先执行enter

    当代码执行完毕后执行exit,或者代码遇到了异常会立即执行exit,并闯入错误信息

    包含错误的类型,错误的信息,错误的追踪信息

    注意:

    enter 函数应该返回有对象自己
    exit 函数可以有返回值,是一个bool类型,用于表示异常是否被处理,仅在上下文中出现异常有用
    如果为True,则意味着异常被处理了
    如果为False,则异常未被处理,程序将终端报错

     

  • 相关阅读:
    读写excel文件
    数据库操作
    django项目搭建
    django基础
    string
    random函数
    vue-typescript入门
    Visual Studio 2019配置vue项目
    js css+html实现简单的日历
    python接口自动化4-绕过验证码登录(cookie)
  • 原文地址:https://www.cnblogs.com/waller/p/11265601.html
Copyright © 2011-2022 走看看