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

浙公网安备 33010602011771号