文章插图
每个中国人,都是天生的元类使用者
学懂元类,你只需要知道两句话:
- 道生一,一生二,二生三,三生万物
- 我是谁?我从哪来里?我要到哪里去?
道生一,一生二,二生三,三生万物 。
- 道 即是 type
- 一 即是 metaclass(元类,或者叫类生成器)
- 二 即是 class(类,或者叫实例生成器)
- 三 即是 instance(实例)
- 万物 即是 实例的各种属性与方法,我们平常使用python时,调用的就是它们 。
2
3
4
5
6
7
8
9
10
11
# 创建一个Hello类,拥有属性say_hello ----二的起源
class Hello():
def say_hello(self, name='world'):
print('Hello, %s.' % name)
# 从Hello类创建一个实例hello ----二生三
hello = Hello()
# 使用hello调用方法say_hello ----三生万物
hello.say_hello()
输出效果:
Hello, world.
这就是一个标准的“二生三,三生万物”过程 。 从类到我们可以调用的方法,用了这两步 。
那我们不由自主要问,类从何而来呢?回到代码的第一行 。
class Hello其实是一个函数的“语义化简称”,只为了让代码更浅显易懂,它的另一个写法是:
2
3
4
def fn(self, name='world'): # 假如我们有一个函数叫fn
print('Hello, %s.' % name)
Hello = type('Hello', (object,), dict(say_hello=fn)) # 通过type创建Hello class ---- 神秘的“道”,可以点化一切,这次我们直接从“道”生出了“二”
这样的写法,就和之前的Class Hello写法作用完全相同,你可以试试创建实例并调用
Python
2
3
4
5
# 从Hello类创建一个实例hello ----二生三,完全一样
hello = Hello()
# 使用hello调用方法say_hello ----三生万物,完全一样
hello.say_hello()
输出效果:
Hello, world. ----调用结果完全一样 。
我们回头看一眼最精彩的地方,道直接生出了二:
Hello = type(‘Hello’, (object,), dict(say_hello=fn))这就是“道”,python世界的起源,你可以为此而惊叹 。
注意它的三个参数!暗合人类的三大永恒命题:我是谁,我从哪里来,我要到哪里去 。
- 第一个参数:我是谁 。在这里,我需要一个区分于其它一切的命名,以上的实例将我命名为“Hello”
- 第二个参数:我从哪里来
在这里,我需要知道从哪里来,也就是我的“父类”,以上实例中我的父类是“object”——python中一种非常初级的类 。 - 第三个参数:我要到哪里去
在这里,我们将需要调用的方法和属性包含到一个字典里,再作为参数传入 。以上实例中,我们有一个say_hello方法包装进了字典中 。
2
3
4
5
6
7
8
class Hello(object){
# class 后声明“我是谁”
# 小括号内声明“我来自哪里”
# 中括号内声明“我要到哪里去”
def say_hello(){
}
}
- 造物主,可以直接创造单个的人,但这是一件苦役 。造物主会先创造“人”这一物种,再批量创造具体的个人 。并将三大永恒命题,一直传递下去 。
- “道”可以直接生出“二”,但它会先生出“一”,再批量地制造“二” 。
推荐阅读
- 首播破亿,口碑两极,《三体》能否帮B站走出“暗黑森林”?
- 丝袜两条线的在哪一边
- 16岁女生标准身高
- 马桶两个孔怎么堵图解
- 钱塘江大潮形成原因是哪两点 钱塘江大潮形成原因
- 辣椒酱的做法
- 豆瓣酱拌茄子的做法
- kamille hand cream_德国的护手霜 一个是Herbacin Wuta Kamille 俗称小甘菊 另一个就叫Kamill 这两种有啥区别
- 淘宝可以同时在两个手机上登录吗
- 湖光秋月两相和的拼音 湖光秋月两相和