zoukankan      html  css  js  c++  java
  • python基础--魔法方法、迭代器、上下文管理

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

        参数一:要判断的对象

        参数二:要判断的类型

    issubclass:判断一个类是否是另一个类的子类

        参数一:是待判断的子类

        参数二:待判断的父类

    __new__:

        主要作用:

            1、new方法主要继承一些不可变的class时(int,str,tuple...),提供给你一个自定义这些类的实例化过程的途径

            2、new方法用来实现自定义的metaclass

        new方法被定义为静态类,并且至少需要传递一个参数cls,cls表示需要实例化的类,在创建实例化的过程中,new方法作用在构造方法init之前,new函数执行执行后会返回实例化对象self,然后将self作为第一个参数传给该类的初始化方法init

        最后的最后一定要去return一下,返回实例化的对象

    __str__:会在对象被转换成字符串对象的时候,转换的结果就是这个函数的返回值

    __del__:手动删除对象的时候就会立刻执行,或者是程序运行结束时也会自动执行

        

    __call__:在调用对象的时候自动执行也就是对象➕括号调用的时候。

    __slots__:这个属性是一个类属性,是用来优化对象的内存占用的

        原理:将原本不固定的属性数量,变得固定了

        这样的解释器就不会为这个对象创建名称空间了,所以__dict__也就没有了,从而达到了内存开销的效果

        另外当类中出现了slots的时候将导致这个类的对象将无法在添加新的属性了

        

    class Person:
            __slots__ = ['name']
            def __init__(self, name):
                    self.name = name
    
    
    p = Person('jack')
    
    # 要是在利用对象来添加属性的话就会报错了...

    getattr:用点访问属性的时候如果属性不存在就会执行__getattr__方法

    setattr:用点设置属性时

    delattr:用del 对象.属性  删除属性时 执行

    以上三个反映了python解释器是如何实现的  用点来访问属性

    getattribute:该函数也是用来获取属性

        在获取属性时如果存在getattribute则先执行该函数,如果没有拿到属性则继续调用getattr函数,如果拿到了就直接返回。

    []的实现原理:

        getitem:当你用中括号中去获取属性时执行

        setitem:当你用中括号中去设置属性时执行

        delitem:当你用中括号中去删除属性时执行

    运算符重载:原本自定义对象是无法直接使用大于小于来进行比较的,我们可以自定义运算符来实现,让自定义对象也支持比较运算符。

        __gt__(self, other):大于

        __lt__(self, other):小于

        __eq__(self, other):等于

        其它的可以到object中自行查看...

        上述的代码中,other指的是另一个参与比较的对象

        大于和小于只要实现一个就可以了,符号如果不同解释器会自动交换两个对象的位置

        

    迭代器协议:

        迭代器是指具有__iter__和__next__的对象,我们也可以为对象增加这两个方法来让对象变成一个迭代器

    class MyRange:
    
        def __init__(self,start,end,step):
            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,2):
        print(i)

    上下文管理:

        __enter__:表示进入上下文(进入了某个场景)

            应该返回对象自己

        __exit__:表示退出上下文(退出了某个场景)

            exit函数可以有返回值,是一个bool类型,用于表示异常是否被处理,仅在上下文中出现异常有用,如果为True就意味着,异常已经被处理,False就表示异常还没有被处理,程序将中断报错。

  • 相关阅读:
    Benelux Algorithm Programming Contest 2016 Preliminary K. Translators’ Dinner(思路)
    Benelux Algorithm Programming Contest 2016 Preliminary Target Practice
    Benelux Algorithm Programming Contest 2016 Preliminary I. Rock Band
    Benelux Algorithm Programming Contest 2016 Preliminary A. Block Game
    ICPC Northeastern European Regional Contest 2019 Apprentice Learning Trajectory
    ICPC Northeastern European Regional Contest 2019 Key Storage
    2018 ACM ICPC Asia Regional
    2018 ACM ICPC Asia Regional
    Mybatis入库出现异常后,如何捕捉异常
    优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止
  • 原文地址:https://www.cnblogs.com/tulintao/p/11265660.html
Copyright © 2011-2022 走看看