python面向对象思想的最深处——元类

简介: 在Python中一切皆对象,对象是实例化的类,而类的背后就是元类,如果说类创造了实例化对象,那么元类就创造了类,元类是类的抽象,这就是元类的概念。如何看一个类的类,我们可以通过__class__属性追溯,实例化当前对象的类,也可以追溯创建当前类的类。

在Python中一切皆对象,对象是实例化的类,而类的背后就是元类,如果说类创造了实例化对象,那么元类就创造了类,元类是类的抽象,这就是元类的概念。

如何看一个类的类,我们可以通过__class__属性追溯,实例化当前对象的类,也可以追溯创建当前类的类。

a = 3
a.__class__
<class 'int'>
a.__class__.__class__
<class 'type'>
b = [12]
b.__class__
<class 'list'>
b.__class__.__class__
<class 'type'>


通过对实例化对象的追溯,我们可以看到int类型是实例化类是int创建的,int的创建对象是type,那么也就是Python中所有对象的元类都是type,都是通过type来创建的的。

那么我们就该知道为什么type可以获得一个实例化对象的类型,但是却不推荐我们使用type来求证一个对象的类型,因为type是对传入对象的一次实例化得到一个类,这个类是创造这个实例化对象的中间类,它代表了这个实例化对象的类型。

a = 3
a.__class__
<class 'int'>
type(a)
<class 'int'>


这就是为什么一个对象使用__class__可以获得他的类型,同样使用type()也可以获得他的类型,一个是追溯,一个是元类实例化。

那么如何使用元类创建类?这就需要type,创建方式是type(类名, 由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

def a(self):
    print("实例化方法")

@classmethod
def b(cls):
    print("类方法")

@staticmethod
def c():
    print("静态方法")

test = type("Test", (), {'a':a'b' :b'c': c, "name" :'class'})
test.b()
类方法
test.c()
静态方法
test.name
'class'
test.__class__
<class 'type'>

d = test()
d.a()
实例化方法
d.b()
类方法
d.c()
静态方法
d.name
'class'


上面代码演示了通过type创建一个类test,并添加类属性和方法,然后实例化该类得到a。

type是Python内建属性,它是用于默认情况下创建类,但是还有另一种情况,自定义元类,自定义元类可以是函数或者类,他们都是对type的二次封装。

我们定义的类,他的实现过程是首先看__metaclass__属性,存在该属性,那么通过这个属性的值来创建类,如果不存在那么将寻找父类中的__metaclass__属性来创建类,如果父类也没有,那么将调用内建的type创建类。


2019-03-23-23_17_53.png


相关文章
|
2月前
|
Python
python-面向对象
python-面向对象
15 2
|
4月前
|
Python
Python 元类 metaclass 详解
Python 元类 metaclass 详解
26 0
|
7天前
|
Python
Python中的面向对象
【5月更文挑战第4天】面向对象编程(OOP)是Python的核心,涉及类与对象、封装、继承和多态。类是对象的模板,对象则是类的实例。例如,`Person`类有`__init__`构造方法和`greet`方法。
15 3
|
12天前
|
算法 Python
Python面向对象oop编程(二)
Python面向对象oop编程(二)
|
22天前
|
数据安全/隐私保护 Python
python基础之面向对象
面向对象编程(OOP)是一种以对象为中心的编程范式,通过对象和类实现现实世界的抽象。对象是程序的基本单元,类是对象的模板。主要特点包括:封装,通过访问修饰符隐藏对象内部细节,保证数据安全;继承,子类继承父类属性和方法,实现代码复用;多态,同方法调用在不同对象上产生不同行为,增强灵活性。示例代码展示了Python中的类定义、封装、继承和多态概念。
|
26天前
|
Java 程序员 Python
python学习13-面向对象的三大特征、特殊方法和特殊属性、类的浅拷贝和深拷贝
python学习13-面向对象的三大特征、特殊方法和特殊属性、类的浅拷贝和深拷贝
|
28天前
|
开发者 Python
「Python系列」Python面向对象
Python 是一种面向对象的编程语言,它提供了类和对象的概念来组织和封装代码。面向对象编程(Object-Oriented Programming,简称 OOP)是一种编程范式,它使用“对象”来设计软件和应用程序。对象是由数据和可以对这些数据执行的操作(即方法)组成的实体。
23 5
|
1月前
|
Python
python基础篇:python面向对象有哪些魔术方法?具体有什么用?
python基础篇:python面向对象有哪些魔术方法?具体有什么用?
17 1
|
2月前
|
Python
Python面向对象(九)
Python面向对象(九)
18 0
Python面向对象(九)
|
2月前
|
Python
07 Python面向对象的三大特点【封装、继承、多态】
07 Python面向对象的三大特点【封装、继承、多态】
6 0