python 元类的使用(类的创建)

    什么是元类?首先我们知道python是一门面向对象的开发语言,在python中万物皆对象,类也是对象。首先我们看下面一段代码,使用class 创建一个类,当我们使用type函数打印类型是class‘type’,type就是一个元类,可以通过元类来创建类。元类就可以创建类的类。

>>> class objectCreate(object):
...     pass
...
>>> type(objectCreate)
<class 'type'>
>>>

创建类的几种方式

   下面来举例集几种类的创建方式,明白类创建的过程(动态创建类)

# 函数创建,
def create_animal(type):
    if type == 'Dog':
        # 创建类
        class Dog(object):
            pass

        return Dog
    elif type == 'Cat':
        class Cat(object):
            pass

        return Cat


Dog = create_animal("Dog")
print(type(Dog))
dog = Dog()
print(type(dog))
<class 'type'>#类类型
<class '__main__.create_animal.<locals>.Dog'>#对象类型

这里通过调用函数传图不同的参数,来创建不同的类,创建出返回的是类的引用,并不是对象,我们可以通过返回的类来创建对象。

使用Type来动态创建类

  type可以根据传入的参数描述,根据具体的需要来动态创建出想要得到的类,传入的参数格式为:

   type(类名,元祖(父类名组成,可以是多个,也可以是空),字典(属性名和属性值))

  

class Test1(object):
    pass


Test2 = type("Test2", (object,), {})

print(type(Test1))
print(type(Test2))

#打印结果
<class 'type'>
<class 'type'>

可以看出两种创建方式是相同的效果,说到这里我们大家应该都明白了,原来type就是创建类的一个方法,python用它来创建类,也就是说他是所有类的元类,例如在pyhton中是不是还有int,str...等等类型,int就是用来创建整数的类,而str就是用来创建字符串的类,这里的type也是,他就是python用来创建类的类(元类)。

这里还有一个属性__class__

按照我的理解就是,对象(类,对象,python中类也是对象).__class__输出当前对象的创建对象。

Test2 = type("Test2", (object,), {})

test2 = Test2()

print(test2.__class__)#类
print(Test2.__class__)#对象
#打印出
<class '__main__.Test2'>#Test2类创建
<class 'type'>#type创建

__metaclass__属性的使用

      __metaclass__属性作用呢是可以在定义类时为类定制化(传入个性化的设置),也就是说,类的创建时根据你的想法来创建的。之前我们创建类时系统默认创建,而现在我们利用metaclass属性可以根据自己的需求来创建类。他是怎么做到的呢?

  

# 定义构造类函数
def diy_class(create_calss_name, create_paretns_name, create_new_attr):
    # 定义字典属性
    newAttr = {}
    for name, value in create_new_attr.items():
        if not name.startswith("__"):
            # 转换属性名首字母大写
            newAttr[name.capitalize()] = value
            print(newAttr)
    return type(create_calss_name, create_paretns_name, create_new_attr)


class Animal(object, metaclass=diy_class):
    dog = 'dog'


print(type(Animal))
print(Animal().dog)
打印效果
{'Dog': 'dog'}
<class 'type'>
dog

这里可以看到这个新创建类的类名为Animal,父类为object,属性Dog值为dog。这里就根据自己的设置创建了想要的类。

注意:这里写的是在python3.x中的创建过程,在类名后的括号中写,在python2中可以不再类的括号中写,在下面直接将__mataclass__ = 具体的构建函数名。




   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值