面向对象中零碎知识点
05-02 ------>metaclass
# ######################################################## 创建类 ########################################################
# 1. 创建类的两种方式
"""
class Foo(object,metaclass=type):
CITY = "bj"
def func(self,x):
return x + 1
Foo = type('Foo',(object,),{'CITY':'bj','func':lambda self,x:x+1}) #这种方式跟上面Foo()类是一样的
##这个跟上面的是一一对应关系
#type('Foo',(object,)------>Foo(object,metaclass=type)
#'CITY':'bj ------>CITY = "bj"
#func(self,x): ------>'func':lambda
#return x + 1 ------>self,x:x+1})
"""
# 2. 类由自定义type创建
# 类由type创建,通过metaclass可以指定当前类由那一个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) #这是执行父类的init方法,也就是执行type的init方法
print('创建类之后')
class Foo(object,metaclass=MyType): # 当前类,由type类创建。(因为MyType继承了type类,所以有type类创建
CITY = "bj"
def func(self, x):
return x + 1
class Bar(Foo):##也就是这个类,也是有type创建,(往上一层一层找继承关系)
pass
"""
# ################################## 变 ##################################
"""
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__
"""
创建类,默认就会执行下面的四步骤方法, 注意,类的实例化,就是执行类的__call__方法 (obj=Foo())
———————————————————————
面向对象相关的__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'>)
———————————————————————
__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__)
print(dir(Foo))
# obj1 = Foo('oldboy',54)
# print(obj1.__dict__)
执行结果如下:
{'__module__': '__main__', 'CITY': 'bj', '__init__': <function Foo.__init__ at 0x00000000023E6A60>, 'func': <function Foo.func at 0x00000000023E6AE8>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
['CITY', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'func']
如果是类的话,查找类里面的所有东西!

如果是对象,拿到对象里面自己的数据。

浙公网安备 33010602011771号