元类

type

        type函数即可返回一个对象的类型,也可动态地创建一个新的类。如:

def say(self):  # 因为该方法要传入到类中,所以必须定义一个self参数
    print("say hello")

d = type('Demo', (object,), dict(say=say))
d1 = d()
d1.say()  # say hello

        第一个参数是类名,第二个参数是类的父类,第三个参数是类中的属性——以字典的形式传入。整句话执行结束后,就相当于创建了一个类名为Demo的类。

        type()创建了一个类,并且使用变量d来作为类的引用。

        可以看出在Python中,类也是对象,可以动态的创建类。这就是当你使用关键字class时Python在幕后做的事情,而这就是通过元类来实现的。

元类

        参考

        python中, 类也是一个对象,对象名就是类名,该对象拥有创建对象(类实例)的能力。做为一个变量,可以为它添加新的属性,可以将它赋值给另一个变量,也可以当作参数传递。如:

>>> class Demo(object):
	pass

>>> D = Demo
>>> print(D)
<class '__main__.Demo'>
>>> Demo.age='age'
>>> print(Demo.age)
age
>>> print(Demo)
<class '__main__.Demo'>

        因为类也是对象,所以可以使用class关键字动态地创建它们。而元类就是创建类的类,它负责创建类,而由类创建类的实例。

        元类就是类的类,它负责创建不同的类,而由不同的类创建不同的类实例。如下:

class DemoMetaClas222s(type):  # 元类
    def __new__(cls, name, bases, attrs):
        print(cls)  # 元类对象
        print(name)  # 创建的类的类名 Demo
        print(bases)  # 创建的类的父类集合
        print(attrs)  # 创建的类的属性(含方法)
        attrs['add'] = lambda self, value: print("the value = %s" % value)  # 为创建的类添加了属性add,它是一个方法
        attrs['name'] = 'namexxxxx'  # 为创建的类添加name属性
        return type.__new__(cls, name, bases, attrs)  # 通过type模块创建新的类


class Demo(object, metaclass=DemoMetaClas222s):  # 通过metaclass指定该类对应的元类
    pass

d = Demo()
d.add(111)  # the value = 111
print(d.name)  # namexxxxx

        元类通过__new__方法操作新建成的类,比如添加方法以及添加属性等。

        新建的类通过metaclass指定它对应的元类。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值