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

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

一. 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

猜你喜欢

转载自www.cnblogs.com/Afrafre/p/10145501.html
今日推荐