如何通过一个字符串来实例化一个类_年薪百万之路--第二十九天 元类

54a3fa5694f66d74ad7a918bc927f2d5.png

一. 反射

1.什么是反射?

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

2.为何用反射?

在调用某个参数时,需要知道这个参数是否有相关的属性或功能

3. 如何实现反射?

> 先通过dir: 查看出某一个对象下可以 . 出哪些属性来

>可以通过字符串反射到真正的属性上,得到属性值

四个内置函数: 通过字符串来操作属性值

1、hasatter() 查看是否存在该属性

2、getatter() 获取该属性的内容

getatter(10, 'x',None) 给一个默认值,使其没有属性时不报错

3、setter() 修改该属性的内容

4、delatter() 删除该属性

二. 内置方法

1、什么是内置方法?

定义在类内部,以__开头并以__结尾的方法

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

2、为什么要用内置方法

为了定制化我们的类或对象

3、如何使用内置方法

__str__: 在打印对象时会自动触发,然后将返回值(必须是字符串 类型)当做本次打印的结果输出

__del__: 在清理对象时触发,会先执行该方法(在程序执行结束后清理空间时也会触发)

class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.x = open('a.txt',mode='w')
        # self.x = 占据的是操作系统资源

    def __del__(self):
        # print('run...')
        # 发起系统调用,告诉操作系统回收相关的系统资源
        self.x.close()

obj = People('辣白菜同学', 18)
# del obj # obj.__del__()
print('============>')

三. 元类

1、什么是元类

元类就是用来实例化产生的类

元类-->实例化-->类-->实例化-->对象

查看内置的元类: print(type(类))

我们用class关键字定义的所有的类都是由元类type实例化得到的

2、class关键字创造类的步骤

类的特征: 类名, 类的基类(父类),执行类体代码拿到类的名称空间

class_dic={}

exec (类体代码,{},class_dic)

然后调用元类

3、如何自定义元类来控制类的产生

class Mymeta(type) #只有继承了type类的类才是元类

class People(mataclass = Mymeta)

People = Mymeta(class_name,class_bases,class_dic)

调用Mymeta发生三件事

  1. 先造一个空对象=>People,调用类内的__new__方法
  2. 调用Mymeta这个类内的__init__方法,完成初始化对象的操作
  3. 返回初始化好的对象

4、__call__方法

如果想让一个对象可以加括号调用,需要在该对象的类中添加一个方法__call__

__call__里的代码干了三件事

  1. 先造一个空对象,调用类内的__new__方法
  2. 调用type这个类内的__init__方法,完成初始化对象的操作
  3. 返回初始化好的对象

5、自定义元类控制类的调用==>类的对象的产生

四. 属性查找

对象的属性查找:

父类不等于元类

对象-->类-->父类

永远不会找到元类去

类的属性查找:

找完父类,去元类里找

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值