python学习笔记DAY20(面向对象编程-反射)

这是我个人的学习笔记,都赖于(egon老师)的分享,以下是老师博客的原地址:
https://www.cnblogs.com/xiaoyuanqujing/articles/11640888.html

面向对象编程_反射

反射、内置方法

前置说明:

class Teacher:
    def __init__(self,name):
        self.full_name = name

obj = Teacher("yunya")

# print(dir(obj))   # 查看对象可以 . 出的全部 属性
# ['__class__', '__delattr__', '__dict__',..., 'full_name']
print(obj.__dict__)  # 查看对象包含的所有属性及对应的属性值
print(obj.__dict__[dir(obj)[-1]])  # yunya

如上:通过dir和dict确实可以用字符串的属性名,访问到属性值。但是,__ 开头的方法基本都是在满足某种条件下用来自动触发的,最好不要主动调用。而且,不是所有对象都有dict 方法的。

1、反射

反射指的是可以在程序运行过程中可以"动态"获取对象的信息。

  • 在程序的某个位置,你获取到了OBJ这个对象,现在让你调取里面的属性。(不止对象从何而来,该如何调用属性?)
    • dir(obj) 可以查看某一个对象下可以 . 出的全部属性(但是此时,dir列出的属性都是字符串类型,不可直接调用)
    • 这时可以通过操作字符串反射到真正的属性上,得到属性值
  • 在python中,反射指的是通过字符串来操作对象的属性,涉及到四个内置函数的使用:
hasattr(obj,"name")   # True 判断一个属性是否在一个对象中
getattr(obj,"name")   # yunya  从对象中获取对应属性
setattr(obj,"name","云崖")   #  修改属性值
getattr(obj,"name")   # 云崖 
delattr(obj,"name")   # 删除属性

实例1:

print(getattr(obj,"x"))  # 直接获取一个属性,如果属性不存在就会报错
if hasattr(obj,"x"):        # 先判断要查询的属性是否存在于当前对象
    print(getattr(obj,"x")) # 如果存在,就获取
else:
    print("此对象没有x这个属性")

实例2:

class Ftp:
    def put(self):
        print("正在执行上传功能")
    def get(self):
        print("正在执行下载功能")
    def interactive(self):
        method = input("--->").strip()    # 用户输入任意属性名
        if hasattr(self,method):          # 如果属性名存在
            func = getattr(self,method)   # 得到属性值
            func()
        else:
            print("输入的指令不存在")        # 属性名不存在,给出提示

obj = Ftp()
obj.interactive()

2、内置方法

python的class机制内置了很多特殊的方法来帮助使用者高度定制自己的类,这些内置方法都是以双下划线开头和结尾的。

特点:会在满足某种条件时自动触发。

实例1:

_str__方法会在被对象打印时自动触发,print功能打印的就是它的返回值,我们通常基于方法来定制对象的打印信息,该方法必须返回字符串类型。

class People:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return f"{self.name,self.age}"  # 返回值类型必须是字符串

p = People("nida",19)
print(p)     # 触发p.__str__(),拿到返回值进行打印   ('nida', 19)

实例2:

del_会在对象呗删除时自动触发。由于python自带垃圾回收机制,会自动清理python程序的资源,所以当一个对象只占用应用程序资源时,完全没有必要为对象定制del_方法,但产生一个对象的同时涉及到申请系统资源(比如系统打开的文件,网络连接等)的情况下,关系系统资源的回收,python的垃圾回收机制就没用了,需要我们为对象定制该方法,用来在对象删除时,自动触发回收系统资源的操作:

class MySQL:
    def __init__(self,ip,port):
        self.conn = connect(ip,port)   # 发起网络连接,需要占用系统资源
    def __del__(self):
        self.conn.close()     # 关闭网络连接,回收系统资源
        
obj = MySQL("172.16.31",8007)
del obj      # 在对象obj被删除时,自动触发obj.__del__
posted @ 2021-06-02 14:04  nida  阅读(57)  评论(0)    收藏  举报