码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-12-19 21:02:52      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:glob   __del__   everyone   判断   时机   iss   global   实例化   语句   

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

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

 

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

标签:glob   __del__   everyone   判断   时机   iss   global   实例化   语句   

原文地址:https://www.cnblogs.com/Afrafre/p/10145501.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!