zoukankan      html  css  js  c++  java
  • 面向对象高级 之 自动触发的内置函数

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

    一. 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
  • 相关阅读:
    7月15日考试 题解(链表+状压DP+思维题)
    暑假集训日记
    C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
    JavaSE 基础 第42节 局部内部类
    JavaSE 基础 第41节 匿名内部类
    JavaSE 基础 第40节 内部类概述
    JavaSE 基础 第39节 接口的应用
    JavaSE 基础 第38节 接口的实现
    JavaSE 基础 第37节 接口概述
    JavaSE 基础 第36节 抽象类概述与使用
  • 原文地址:https://www.cnblogs.com/Afrafre/p/10145501.html
Copyright © 2011-2022 走看看