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元类产生的,所以元类产生类对象

4. __class__、__base__、__name__、__dict__