1. python3 中的object和type的关系
- 在python中,一切都是对象,类名是可以进行赋值的,就是因为其实类也是一个对象,叫类对象,比如:
myint=int
print(myint('4')) #输出4
- type即可以表示一个类对象,也可以表示一个元类,见如下代码:
print(type.__base__) #输出:<class 'object'>
mytype=type ; mytype(1) #输出 <class 'int'> 它可以进行赋值,此时类对象
class a(type):pass
type(a) #输出<class 'type'> 此时它表示元类
2. __new__() 和 __init()__ 方法的区别
__new__()方法一定要有return语句, 因为__init__()方法需要接收__new__()传递过来的对象引用,进行实例化操作。
所以他们的调用顺序:__new__()方法一定比__init()方法先执行。
class a(object):pass
class c(object):pass
class b(a):
def __new__(cls): # cls表示当前类的别名
print('this is __new__')
return super().__new__(cls) #表示使用a.__new__(b)方法为类b分配内存
#return a.__new__(cls) #采用a.__new__(cls)好像也没问题
#return c.__new__(cls) #这样也没有报错,尴尬了。。。。
#return super().__new__(c) #只输出this is __new__就没了,因为__init__没有收到对b的引用
def __init__(self):
print('this is __init__')
pass
#输出效果
>>> b()
>>> this is __new__
>>> this is __init__
3. 元类( 乱七八遭,待续)
我的理解:
--只有元类、类对象、实例对象,我们平时提的类,其实指的是类对象
class mymeta(type):pass # type和mymeta都是元类
class myclass(object): pass # 这是一个类对象,一般说创建了一个类,代码放在这时,对象已经建立
myclass() #这是实例化对象
--每个类对象的创建需要一个物质基础,元类不是物质基础,是虚的,不能作为类的对象的载体,python通过元类创建了一个object对象,这是一个初始的模型轮廓,其他所有的类对象都需要在
举一个现实例子:
有一个客户(对应__init__()方法),跟一家汽车制造工厂(对应type元类)下100辆小汽车的订单,工厂开心死了,马上要上马100辆,结果客户说先生产一辆样车(对应类对象)给我看看。制造工厂犯难,跟客户说,我们的制造部门(对应__new__()方法)刚好有一些库存小汽车,质量杆杆的。客户说不行,客户就是上帝,没办法工厂只能成立A客户小汽车样车项目组(对应cls),由项目组向客户了解具体需求,
A客户:建议你们内部给我的小汽车产品起个代号
项目组:我们已经有了,就叫“A客户小汽车样车”(对应name)
A客户:这么长,你们开心就好~
项目组:我们这边已经有一些成功量产的车型,您要不要看下样车,满意的话,设计都不用改,我们的制造部门(对应object.__new__())直接可以批量生产
A客户:来之前我就了解过了,这些车型是挺好,但是我要的是会飞的小汽车。
项目组:这个简单,只要在原有车型(对应bases)上加上翅膀就可以了,请相信我们的技术
项目就这么开始了,设计部门当晚就往原车型的图纸里面加入了牛逼的翅膀(对应attrs['新功能']=‘牛逼的翅膀’),并把图纸(对应(cls,name,bases,attrs))发给制造部门开始生产(object.__new__(cls,name,bases,attrs))了
元类是用来创建类对象的,所有类对象都是通过type.__new__(cls,name,bases,attrs)或者type(cls,name,bases,attrs)的方式创建
--通过自定义元类创建类对象,最终也是要依靠type来进行对象创建,只是在这之前我们可以赋予他更多功能
--元类和继承:元类是可以继承的,__new__()不会继承,我们首先要问他的元类是什么?
元类:type、以及自定义的元类,如class mymeta(type):pass
类对象:按一般的说法,定义一个类时,如class myclass(object):pass,其实是创建了一个类对象,此时是可以进行赋值操作的。如果不自定义元类,所有的类对象都继承自object这个类对象,object这个类对象又由type元类产生的,所以元类产生类对象