• 面向对象高级 之 自动触发的内置函数


    ---恢复内容开始---

    一. isinstance(obj, 类)  判断对象是不是某个类的实例

    print(isinstance(1,int))
    
    class Person:
        pass
    
    p = Person()
    
    print(isinstance(p,Person))
    
    # 结果都为True

    二. issubclass(子类,父类)   判断是否为子类,可以是子子类

    class Person:
        pass
    
    class Student(Person):
        pass
    
    print(issubclass(Student,Person))
    
    # 结果为True

    三. 反射

    当获得了一个对象,但不清楚对象的内部细节,用到反射

    1. hasattr : 是否存在某个attribute

    2. getattr : 得到 attribute

    3. setattr: 设置 attribute

    4. delattr: 删除 attribute

    class Person:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def eating(self):
            print('everybody can eat')
    
    p = Person('egon',18)
    
    # 判断是否有属性(返回 True, False)
    print(hasattr(p, 'name'))
    
    #设置属性
    setattr(p,'gender','male')
    print(p.__dict__)
    #{'name': 'egon', 'age': 18, 'gender': 'male'}

    # 设置方法
    def run(self):
    print('everyone can run')
    setattr(p,'run',run)

    p.run(p) # 如果是外部添加的函数,调用时必须传入对象作为参数(因为他只是一个函数,不是方法)
    # 得到属性,三个参数,如果没有要找的属性,返回第三个值内容
    res = getattr(p,'gender','没有该属性')
    print(res)  # male
    
    res = getattr(p,'wo','没有这个属性')
    print(res)  # 没有这个属性
    
    # 删除属性
    
    delattr(p,'name')
    
    print(p.name)  # 属性已经删除,报错

     特殊的内置函数:

      一般情况下,带杠杠的内置函数都是在某些时机自动触发的

    1. __str__  : 打印时调用的函数,必须返回字符串

    2. __del__ :    当程序运行结束时,对象从内存中被删除时会自动执行

           删除的两种方式:1. 手动删除 del stu 

                   2. 当程序运行结束后自动删除__del__

      __del__ 用途: 打开文件占两方面内存: 应用程序内存和操作系统内存

             python 自己创建的数据,在执行结束后自动清理,但当使用python打开一个不属于python管理的数据,就需要__del__ 函数手动设置关闭。

    # 例:__del__  实际应用
    class TextFile:
        def __init__(self,filepath,mode = 'rt',encoding = 'utf-8'):
            self.file = open(filepath,mode = mode,encoding=encoding)
            
        def read(self):
            return self.file.read()
        
        def write(self,text):
            self.file.write(text)
        # 通知程序员,对象即将被删除    
        def __del__(self):
            self.file.close()
    
    tf = TextFile('a.txt',mode = 'wt')
    
    tf.write('aaaa')

    3. exec   :excute  表示执行

      作用: 解析字符串中的python代码,并将得到的名称存储到指定的名称空间

      参数1:需要一个字符串对象, 字符串中为python语句

      参数2:是一个字典,全局名称空间

      参数3:也是一个字典,局部名称空间

      注意: 如果没有声明全局,默认为局部变量

      语法: exec(msg,globalsdic,localsdic)

    4. __call__ : 调用对象时执行,执行的是对象所在类中的__call__方法

    class People:
        def __call__(self, *args, **kwargs):
            print('call is running!')
    
        def eat(self):
            print('everyone need to eat')
    
    p = People()
    p()   # call is running!

    总结:调用对象,对象的类中的__call__方法运行

    总结四种内置的自动触发的函数:

    # People = type(...)
    class Foo:
        #对象实例化时自动触发
        def __init__(self):
            pass
        #打印时自动触发,必须存在返回值,返回值为字符串
        def __str__(self):
            pass
        # 程序运行结束,对象被删除时,自动触发
        def __del__(self):
            pass
        # 调用对象时,自动触发对象所在类中的__call__函数
        def __call__(self, *args, **kwargs):
            pass
        
    obj = Foo()  # 创建对象,__init__函数自动触发
    print(obj)   # 打印自动触发 __str__
    obj(1,2,3) # 自动执行__call__方法 (参数为: self:obj   *args: 1,2,3
  • 相关阅读:
    maven dependencies 里面的包怎么导出
    webUploader react 接口设计
    HTML5 History API实现无刷新跳转
    Object.defineproperty实现数据和视图的联动
    jsLoader、cssLoader、imageLoader
    【转】前端工程化-公共模块的依赖和常用的工作流
    JDBC详解
    正则表达式
    【GOF23设计模式】备忘录模式
    【GOF23设计模式】观察者模式
  • 原文地址:https://www.cnblogs.com/Afrafre/p/10145501.html
Copyright © 2020-2023  润新知