这里写目录标题
0. 类的__mro__:属性继承顺序
class A(object):pass
class B(A):pass
class C(object):pass
class D(B,C):pass
print(D.__mro__)#属性继承顺序
# (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>)
1. 类的__dict__ VS 对象的__dict__:
class Foo(object):
TEST = 'test'
def __init__(self,u,o):
self.u = u
self.o = o
def func(self):
pass
类的__dict__:
找到Foo类里面所有的属性,输出dict类型
print(Foo.__dict__) #找到Foo类里面所有的属性,输出dict类型
{'__module__': '__main__', 'TEST': 'test', '__init__': <function Foo.__init__ at 0x014C8148>,
'func': <function Foo.func at 0x014C8100>,
'__dict__': <attribute '__dict__' of 'Foo' objects>,
'__weakref__': <attribute '__weakref__' of 'Foo' objects>,
'__doc__': None}
对象的__dict__:
找到Foo初始化init里面所有的属性,输出dict类型
print(Foo('u','o').__dict__)#找到Foo初始化init里面所有的属性,输出dict类型
{'u': 'u', 'o': 'o'}
2. python类的创建方式:
# 1.种
class Foo(object):
something = 'st'
# 2.种
Foo0 =type('Foo',(object,),{"something":"st",'func_name':lambda self,x:x+1})
3. 类创建默认metaclass=type,自定义type
类的创建,就是默认type类创建的,因此,
我们可以自定义mytype继承type,在创建类时实现更多的功能
class Foo(object,metaclass=type):
pass
'''
3.1 自定义type:MyType
这里就没有加其他自定义功能,只是做了print示意
class MyType(type):
def __init__(self,*args,**kwargs):
print('创建类之前')
super(MyType,self).__init__(*args,**kwargs)
print('创建类之后')
3.2 使用自定义type创建类
class Foo_1(object,metaclass=MyType):# 当前类,由MyType创建
pass
3.3 继承类,则metaclass同基类相同
class Foo_1(object,metaclass=MyType):# 当前类,由MyType创建
pass
'''
创建的类Bar,继承一个由MyType自定义type类创建的类Foo_1,此时,类Bar也是由基类中的metaclass
即:继承类,则metaclass同基类相同
'''
class Bar(Foo_1):
pass
3.4 函数的方式创建类
def with_metaclass(arg):
return MyType('Base',(arg,),{})
# 等同于Foo_2继承Base类,且Base类是metaclass=MyType类创建
class Foo_2(with_metaclass(object)):
pass
4. 实例化类时,执行过程总结
'''实例化'''
class MyType(type):
def __init__(self,*args,**kwargs):
print('创建类之前')
super(MyType,self).__init__(*args,**kwargs)
print('创建类之后')
class Foo(object,metaclass=MyType):
pass
obj = Foo()
'''
0.Foo类创建时,MyType的__init__
Foo()实例化时:
1.MyType的__call__
2.Foo的__new__
3.Foo的__init__
'''