面向对象高级 之 自动触发的内置函数
Posted afrafre
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象高级 之 自动触发的内置函数相关的知识,希望对你有一定的参考价值。
---恢复内容开始---
一. 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
以上是关于面向对象高级 之 自动触发的内置函数的主要内容,如果未能解决你的问题,请参考以下文章