11、反射、内置方法

11.1 反射

1、什么是反射

反射机制指的是在程序的运行状态中

对于任意一个类,都可以知道这个类的所有属性和方法;

对于任意一个对象,都能够调用他的任意方法和属性。

这种动态获取程序信息以及动态调用对象的功能称为反射机制。

2、为什么要用反射

函数接收到一个参数后,要去判断里面是否有属性可以去访问

3、如何实现反射

class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
        
    def say(self):
        pass


obj = People('upup',12,'男')

# 实现反射的步骤
# 1.先通过dir 查看出某一个对象下可以.出哪些属性来
print(dir(obj))

# 2.可以通过字符串反射到真正的属性上,得到属性值
# print(obj.__dict__[dir(obj)[-2]])

# 四个内置函数的使用
# hasatter() 判断某一个属性在不在对象里面
# print(hasattr(obj,'name'))  # True

# getattr() 获取属性
print(getattr(obj,'name'))  # upup

# setattr() 赋值属性
print(setattr(obj,'name','UP'))
print(obj.name)   # UP

# delattr() 删除属性
delattr(obj,'name')

# print(getattr(obj,'say'))

# 如果没有这个属性值,也不会报错的方式
if hasattr(10,'x'):
    print(getattr(10,'x'))
else:
    pass

print(getattr(10,'x',None))

if hasattr(10,'x'):
    setattr(obj,'x',12)
else:
    pass

11.2内置方法

1、什么是内置方法

定义在类内部,以两个下划线开头并以两个下划线结束的的方法

特点:会在某种情况下自动触发并执行

2、为何要使用内置方法

为了定制类、对象

3、如何使用内置方法

str方法

# __str__:会在对象被打印时自动触发,print功能打印的就是它的返回值,通常基于方法来定制对象的打印信息,该方法必须返回字符串类型
class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def __str__(self):
        print('%s:%s' % (self.name,self.age))
        return 'haha'

obj1 = People('upup',12,'男')
print(obj1)

# upup:12
# haha

del方法

# __del__:在清理对象时候触发,会先执行该方法
# 发起系统调用,告诉操作系统回收相关的系统资源

class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def __del__(self):
        pass

obj1 = People('upup',12,'男')
print(obj1)

11.3元类

1、什么是元类

因为一切皆为对象,如果说类也是对象,元类就是用来实例化产生类的类

# 关系:元类---实例化---->类(People)---实例化---->对象(obj)
class People:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def say(self):
        print('%s:%s' %(self.name,self.name))


# print(People.__dict__)
# 如何得到对象
# obj=调用类()
obj=People('egon',18)
# print(type(obj))
# 如果说类也是对象
# People=调用类(。。。)

# 查看内置的元类:
# 1、type是内置的元类
# 2、我们用class关键字定义的所有的类以及内置的类都是由元类type实例化产生
print(type(People))
print(type(int))

class机制分析

# class 关键字创造类people的步骤
# 类有三大特征:
# 1.类名
class_name = 'People'
# 2.类的基类
class_bases = (object)
# 3.通过执行类体代码,拿到类的名称空间
class_dic = {}
class_body = """
def __init__(self,name,age):
    self.name=name
    self.age=age
def say(self):
    print('%s:%s' %(self.name,self.name))

"""
exec (class_body,{},class_dic)
print(class_dic)

# 4.调用元类,调用内置的元类
People = type(class_name,class_bases,class_dic)
posted on 2022-07-26 21:50  AprilX  阅读(34)  评论(0)    收藏  举报