__mro__,找到当前类寻找属性的顺序

面向对象的一些补充(type创建类,__mro__),  随笔 第1张
class A(object):
    pass


class B(A):
    pass


class C(object):
    pass

class D(B,C):
    pass

print(D.__mro__)
面向对象的一些补充(type创建类,__mro__),  随笔 第2张

__dict__

获取当前类的所有属性

面向对象的一些补充(type创建类,__mro__),  随笔 第3张
class Foo(object):
    CITY = 'bj'
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def func(self):
        pass

# print(Foo.CITY)
# print(Foo.func)
print(Foo.__dict__)

obj1 = Foo('oldboy',54)
print(obj1.__dict__)
面向对象的一些补充(type创建类,__mro__),  随笔 第4张

__dict__获取的是一个字典,还可以通过dir获取字典的键

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

metaclass

1. 创建类的两种方式

面向对象的一些补充(type创建类,__mro__),  随笔 第5张
class Foo(object):
    CITY = "bj"

    def func(self,x):
        return x + 1

Foo = type('Foo',(object,),{'CITY':'bj','func':lambda self,x:x+1})
面向对象的一些补充(type创建类,__mro__),  随笔 第6张

2. 类由自定义type创建

类由type创建,通过metaclass可以指定当前类由那一个type创建,默认为type类

面向对象的一些补充(type创建类,__mro__),  随笔 第7张
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

class Foo(object,metaclass=MyType): # 当前类,由type类创建。
    CITY = "bj"
    def func(self, x):
        return x + 1
面向对象的一些补充(type创建类,__mro__),  随笔 第8张

3. 类的继承

类的基类中指定了metaclass,那么当前类也是由metaclass指定的类来创建当前类

面向对象的一些补充(type创建类,__mro__),  随笔 第9张
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

class Foo(object,metaclass=MyType): # 当前类,由type类创建。
    CITY = "bj"
    def func(self, x):
        return x + 1

class Bar(Foo):
    pass
面向对象的一些补充(type创建类,__mro__),  随笔 第10张

Bar也使有MyType创建的

其它形式

面向对象的一些补充(type创建类,__mro__),  随笔 第11张
# ################################## 变 ##################################
"""
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

Base = MyType('Base',(object,),{})
# class Base(object,metaclass=MyType):
#     pass

class Foo(Base):
    CITY = "bj"
    def func(self, x):
        return x + 1
"""
# ################################## 变 ##################################
"""
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

def with_metaclass(arg):
    return MyType('Base',(arg,),{}) # class Base(object,metaclass=MyType): pass

class Foo(with_metaclass(object)):
    CITY = "bj"
    def func(self, x):
        return x + 1
"""
面向对象的一些补充(type创建类,__mro__),  随笔 第12张

类实例化的过程

面向对象的一些补充(type创建类,__mro__),  随笔 第13张
class MyType(type):
    def __init__(self,*args,**kwargs):
        super(MyType,self).__init__(*args,**kwargs)

class Foo(object,metaclass=MyType): # 当前类,由type类创建。
    pass


"""
0. Mytype的__init__
obj = Foo() 
1. MyType的__call__
2. Foo的__new__
3. Foo的__init__
"""
面向对象的一些补充(type创建类,__mro__),  随笔 第14张

总结

1. 默认类由type实例化创建。
2. 某个类指定metaclass=MyType,那么当前类的所有派生类都由于MyType创建。
3. 实例化对象的顺序
  - type.__init__ 
  - type.__call__
  - 类.__new__
  - 类.__init__

,

__mro__,找到当前类寻找属性的顺序

面向对象的一些补充(type创建类,__mro__),  随笔 第15张
class A(object):
    pass


class B(A):
    pass


class C(object):
    pass

class D(B,C):
    pass

print(D.__mro__)
面向对象的一些补充(type创建类,__mro__),  随笔 第16张

__dict__

获取当前类的所有属性

面向对象的一些补充(type创建类,__mro__),  随笔 第17张
class Foo(object):
    CITY = 'bj'
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def func(self):
        pass

# print(Foo.CITY)
# print(Foo.func)
print(Foo.__dict__)

obj1 = Foo('oldboy',54)
print(obj1.__dict__)
面向对象的一些补充(type创建类,__mro__),  随笔 第18张

__dict__获取的是一个字典,还可以通过dir获取字典的键

metaclass

1. 创建类的两种方式

面向对象的一些补充(type创建类,__mro__),  随笔 第19张
class Foo(object):
    CITY = "bj"

    def func(self,x):
        return x + 1

Foo = type('Foo',(object,),{'CITY':'bj','func':lambda self,x:x+1})
面向对象的一些补充(type创建类,__mro__),  随笔 第20张

2. 类由自定义type创建

类由type创建,通过metaclass可以指定当前类由那一个type创建,默认为type类

面向对象的一些补充(type创建类,__mro__),  随笔 第21张
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

class Foo(object,metaclass=MyType): # 当前类,由type类创建。
    CITY = "bj"
    def func(self, x):
        return x + 1
面向对象的一些补充(type创建类,__mro__),  随笔 第22张

3. 类的继承

类的基类中指定了metaclass,那么当前类也是由metaclass指定的类来创建当前类

面向对象的一些补充(type创建类,__mro__),  随笔 第23张
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

class Foo(object,metaclass=MyType): # 当前类,由type类创建。
    CITY = "bj"
    def func(self, x):
        return x + 1

class Bar(Foo):
    pass
面向对象的一些补充(type创建类,__mro__),  随笔 第24张

Bar也使有MyType创建的

其它形式

面向对象的一些补充(type创建类,__mro__),  随笔 第25张
# ################################## 变 ##################################
"""
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

Base = MyType('Base',(object,),{})
# class Base(object,metaclass=MyType):
#     pass

class Foo(Base):
    CITY = "bj"
    def func(self, x):
        return x + 1
"""
# ################################## 变 ##################################
"""
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

def with_metaclass(arg):
    return MyType('Base',(arg,),{}) # class Base(object,metaclass=MyType): pass

class Foo(with_metaclass(object)):
    CITY = "bj"
    def func(self, x):
        return x + 1
"""
面向对象的一些补充(type创建类,__mro__),  随笔 第26张

类实例化的过程

面向对象的一些补充(type创建类,__mro__),  随笔 第27张
class MyType(type):
    def __init__(self,*args,**kwargs):
        super(MyType,self).__init__(*args,**kwargs)

class Foo(object,metaclass=MyType): # 当前类,由type类创建。
    pass


"""
0. Mytype的__init__
obj = Foo() 
1. MyType的__call__
2. Foo的__new__
3. Foo的__init__
"""
面向对象的一些补充(type创建类,__mro__),  随笔 第28张

总结

1. 默认类由type实例化创建。
2. 某个类指定metaclass=MyType,那么当前类的所有派生类都由于MyType创建。
3. 实例化对象的顺序
  - type.__init__ 
  - type.__call__
  - 类.__new__
  - 类.__init__

,面向对象的一些补充(type创建类,__mro__),  随笔 第29张
class A(object):
    pass


class B(A):
    pass


class C(object):
    pass

class D(B,C):
    pass

print(D.__mro__)
面向对象的一些补充(type创建类,__mro__),  随笔 第30张

__dict__

获取当前类的所有属性

面向对象的一些补充(type创建类,__mro__),  随笔 第31张
class Foo(object):
    CITY = 'bj'
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def func(self):
        pass

# print(Foo.CITY)
# print(Foo.func)
print(Foo.__dict__)

obj1 = Foo('oldboy',54)
print(obj1.__dict__)
面向对象的一些补充(type创建类,__mro__),  随笔 第32张

__dict__获取的是一个字典,还可以通过dir获取字典的键

metaclass

1. 创建类的两种方式

面向对象的一些补充(type创建类,__mro__),  随笔 第33张
class Foo(object):
    CITY = "bj"

    def func(self,x):
        return x + 1

Foo = type('Foo',(object,),{'CITY':'bj','func':lambda self,x:x+1})
面向对象的一些补充(type创建类,__mro__),  随笔 第34张

2. 类由自定义type创建

类由type创建,通过metaclass可以指定当前类由那一个type创建,默认为type类

面向对象的一些补充(type创建类,__mro__),  随笔 第35张
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

class Foo(object,metaclass=MyType): # 当前类,由type类创建。
    CITY = "bj"
    def func(self, x):
        return x + 1
面向对象的一些补充(type创建类,__mro__),  随笔 第36张

3. 类的继承

类的基类中指定了metaclass,那么当前类也是由metaclass指定的类来创建当前类

面向对象的一些补充(type创建类,__mro__),  随笔 第37张
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

class Foo(object,metaclass=MyType): # 当前类,由type类创建。
    CITY = "bj"
    def func(self, x):
        return x + 1

class Bar(Foo):
    pass
面向对象的一些补充(type创建类,__mro__),  随笔 第38张

Bar也使有MyType创建的

其它形式

面向对象的一些补充(type创建类,__mro__),  随笔 第39张
# ################################## 变 ##################################
"""
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

Base = MyType('Base',(object,),{})
# class Base(object,metaclass=MyType):
#     pass

class Foo(Base):
    CITY = "bj"
    def func(self, x):
        return x + 1
"""
# ################################## 变 ##################################
"""
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

def with_metaclass(arg):
    return MyType('Base',(arg,),{}) # class Base(object,metaclass=MyType): pass

class Foo(with_metaclass(object)):
    CITY = "bj"
    def func(self, x):
        return x + 1
"""
面向对象的一些补充(type创建类,__mro__),  随笔 第40张

类实例化的过程

面向对象的一些补充(type创建类,__mro__),  随笔 第41张
class MyType(type):
    def __init__(self,*args,**kwargs):
        super(MyType,self).__init__(*args,**kwargs)

class Foo(object,metaclass=MyType): # 当前类,由type类创建。
    pass


"""
0. Mytype的__init__
obj = Foo() 
1. MyType的__call__
2. Foo的__new__
3. Foo的__init__
"""
面向对象的一些补充(type创建类,__mro__),  随笔 第42张

总结

1. 默认类由type实例化创建。
2. 某个类指定metaclass=MyType,那么当前类的所有派生类都由于MyType创建。
3. 实例化对象的顺序
  - type.__init__ 
  - type.__call__
  - 类.__new__
  - 类.__init__

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄