46
编辑日期: 2024-11-28 文章阅读: 次
@author jackzhenguo
@desc
@date 2019/3/4
46 元类使用介绍
xiaoming
, xiaohong
, xiaozhang
都是学生,这类群体叫做 Student
.
Python 定义类的常见方法,使用关键字 class
In [36]: class Student(object):
...: pass
xiaoming
, xiaohong
, xiaozhang
是类的实例,则:
xiaoming = Student()
xiaohong = Student()
xiaozhang = Student()
创建后,xiaoming 的 __class__
属性,返回的便是 Student
类
In [38]: xiaoming.__class__
Out[38]: __main__.Student
问题在于,Student
类有 __class__
属性,如果有,返回的又是什么?
In [39]: xiaoming.__class__.__class__
Out[39]: type
哇,程序没报错,返回 type
那么,我们不妨猜测:Student
类,类型就是 type
换句话说,Student
类就是一个对象,它的类型就是 type
所以,Python 中一切皆对象,类也是对象
Python 中,将描述 Student
类的类被称为:元类。
按照此逻辑延伸,描述元类的类被称为:元元类,开玩笑了~ 描述元类的类也被称为元类。
聪明的朋友会问了,既然 Student
类可创建实例,那么 type
类可创建实例吗? 如果能,它创建的实例就叫:类 了。 你们真聪明!
说对了,type
类一定能创建实例,比如 Student
类了。
In [40]: Student = type('Student',(),{})
In [41]: Student
Out[41]: __main__.Student
它与使用 class
关键字创建的 Student
类一模一样。
Python 的类,因为又是对象,所以和 xiaoming
,xiaohong
对象操作相似。支持:
- 赋值
- 拷贝
- 添加属性
- 作为函数参数
In [43]: StudentMirror = Student # 类直接赋值 # 类直接赋值
In [44]: Student.class_property = 'class_property' # 添加类属性
In [46]: hasattr(Student, 'class_property')
Out[46]: True
元类,确实使用不是那么多,也许先了解这些,就能应付一些场合。就连 Python 界的领袖 Tim Peters
都说:
“元类就是深度的魔法,99%的用户应该根本不必为此操心。