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------------------------后续继续更新-----随缘---------------------