Python中的元类

1.类也是对象

        在大多数的编程语言中,类就是一组用来描述如何生成一个对象的代码段,在python中这一点仍然成立。

class A(object):
    pass


a = A()
print(a)
# <__main__.A object at 0x00000294B0623F10>

        但是,在python中的类也是一种对象,当你使用关键字class时,python解释器在执行的时候就会创建一个对象。

        如上的代码,将在内存中创建一个对象,名字就是A,这个对象拥有创建对象的能力,但它本质仍然是一个对象。即它可以有以下的操作

1.可以将它赋值给一个变量

2.可以拷贝它

3.可以增加属性

4.可以将它作为函数参数进行传递

2.利用globals查看

a = 100
print(globals())
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000024DAF257D90>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:\\pycharmOpt\\seniorProgramming\\test.py', '__cached__': None, 'a': 100}

        如上代码(拖到最后),当我们定义一个变量时,实际是将a存到一个字典中,当进行print打印时,实际是将a拿到字典中进行遍历,直到找到a的值。

        利用关键字查看内嵌函数

b = globals()
print(b['__builtins__'].__dict__)

        当执行以上代码时,你会发现python中的内嵌函数都是以字典的形式存在。

所以当我们定义一个函数、类、全局变量时,其实就是创建一个 “对象”,然后再globals获取的这个字典中添加一个名字。让这个名字指向刚刚创建的对象空间而已。

3.实现元类

        了解以上之后,那我们先来实现一下简单的元类。

def select_class(class_name):
    if class_name == 'demo':
        class Demo(object):
            pass

        return Demo  # 返回的是类, 不是类的实例

    else:
        class Test(object):
            pass

        return Test


my_class = select_class('demo')
print(my_class)  # 函数返回的是类,不是类的实例
# <class '__main__.select_class.<locals>.Demo'>
a = my_class() # 通过这个类创建类实例,也就是对象
print(a)
# <__main__.select_class.<locals>.Demo object at 0x000001DA6EE01DE0>

        通过这个简单的例子是不是更加清楚的了解了什么是元类了呢,但通过这个方法实现会发现不太方便,如果有多个类需要实现,就需要多个if-else,这样会显得比较臃肿,所以我们使用type来实现动态创建类。

        直接看例子

Test1 = type("Test1", (), {})
print(Test1)
print(Test1())  # 实例对象

        Test1相当于是一个类的名字,第二个参数是元组,用于继承。第三个参数是创建类的内容。

--------------------------------3.27------------------------后续继续更新-----随缘---------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值