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