Python_基础_(元类)

 

 

一,

在Python中一切皆对象,类本身就是一个对象,当使用关键字class创建一个类时,Python解释器在加载class时就会创建一个对象

## 证明一个类是type的对象的例子

class Test:
    pass

t = Test()
print(type(t))      # <class '__main__.Test'>
print(type(Test))   # <class 'type'>
# t为类Test的对象
# 类Test时类type的一个对象

 

## 什么是元类

1,元类是类的类,是类的模板

2,元类用来控制如何创建类的,正如创建对象的模板一样

3,元类的示例为类,正如类的实例为对象(t为类Test的一个实例,类Test是type的一个实例)

4,type是python的一个内建元类,用来控制直接生成类,python中任何class定义的类都是type实例化的对象

## 如何用type表示一个类

class Test:
    pass
print(Test) # <class '__main__.Test'>

Test_1 = type("Test_1",(object,),{"x":1})    
# type("类名",(类继承的类以元组形式写入),"类中的属性以字典方式写入")
print(Test_1)   # <class '__main__.Test_1'>

 

## 用一个type表示一个类,并在类中添加方法

def __init__(self,name,age):
    self.name = name
    self.age = age
    
# 备选内置方法 test
def test(self):
    print("我是test方法")

Test_1 = type("Test_1",(object,),{"x":1,"__init__":__init__,"test":test})
print(Test_1)   # <class '__main__.Test_1'>
t = Test_1("henry",18)
print(t.x)      # 1
print(t.name)   # henry
print(t.test()) # 我是test方法 

 

# 自定义元类

如果一个类没有自定义自己的元类,那么它的元类就是type,除了使用type来作为自己的元类,用户也可通过继承type来自定义元类

## 自定义元类

class MyType(type):
    def __init__(self,test_class,test_super,test_attr):
        print(test_class)   # 类Test的类名: Test
        print(test_super)   # 类Test的父类元组:()
        print(test_attr)    # 类Test的属性字典:{'__module__': '__main__', '__qualname__': 'Test'}

class Test(metaclass=MyType):
    # Test = Mytype("Test",(),{})
    # 传了4个参数给MyType
    def __init__(self,name):
        self.name = name

print(Test)         # 拿到对象Test
t = Test("henry")   # 可以进行实例化
print(t.__dict__)

 

....待完成

 

posted @ 2019-04-03 10:43  一头牛这么多人放  阅读(232)  评论(0编辑  收藏  举报