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

class A(object):
    pass


class B(A):
    pass


class C(object):
    pass

class D(B,C):
    pass

print(D.__mro__)

__dict__

获取当前类的所有属性

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__)

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

metaclass

1. 创建类的两种方式

class Foo(object):
    CITY = "bj"

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

Foo = type('Foo',(object,),{'CITY':'bj','func':lambda self,x:x+1})

2. 类由自定义type创建

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

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

3. 类的继承

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

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

Bar也使有MyType创建的

其它形式

# ################################## 变 ##################################
"""
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
"""

类实例化的过程

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__
"""

总结

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

posted on 2018-05-02 18:53  Py行僧  阅读(117)  评论(0编辑  收藏  举报