手写类的实现
道家说一生二,二生三,三生万物。而python中万物皆对象,类也是对象
一、类在内存中的样子
定义一个类其实就是在内存中划分一个地址,并将这个类名指向了这个地址的唯一引用。由这个类实例化出一个对象就是划分新的地址,让对象名指向对象的地址。那如何知道这个对象是哪个类呢,对象都有一个__class__的属性,可以关联到自己的类
二、套娃开始
既然可以通过__class__找到自己的类,对象也是类,那类的类是谁呢?我陷入了沉思,于是代码撸了一把发现了端倪
a = 10
b = "YYDS"
class Person:
pass
p = Person()
print(a.__class__) # 10这个对象的类是int
print(int.__class__) # int类对象的类是什么?
print(b.__class__) # "YYDS"的类是str
print(str.__class__) # str类对象的类是什么?
print(p.__class__) # p对象的类是Person
print(Person.__class__) #Person类对象的类又是什么?
这几个问题,让我想到了吕秀才…然而python给了我完美的答案,类对象的类都是type,还是类???于是我赶快百度了一下
额,好吧这个type是个叫元类的东西,是产生类的模板,那我产生了一个大胆的想法,万物皆对象,所以元类也是对象,那他的类又是什么?
终于到头了,可以看到这个type的类还是type套娃结束了…
三、class Person到底做了什么
上图可以看到,类都是type实例化出来的,所以只要给type指定了他是个什么样的类,那不就能到的一个具体的类对象了吗。用代码可以看到type的提示,第二中用法
这个name不就是给类取个名,dict就是类的类属性,方法等啊,至于tuple其实是这个类想要继承的父类
def eat(self):
print(self.name + "在吃饭")
Person = type("Person", (), {"age": "18", "eat": eat})
print(Person.__class__)
p = Person()
p.name = "张三"
p.eat()
居然和class Person起到了一模一样的作用,原来class就是个这,不明觉厉啊