元类使用示例

2018-01-10  本文已影响112人  马小跳_

知识储备:
元类的作用:拦截类的创建,做一些自定义的操作,并将修改过的类返回给调用者。

案例演示:
现在有一个类Student,静态字段age为整型。现在想将每一个实例化得到的Student对象中的age属性都加10。

class Stdent():
    age = 10

stu = Stdent()
print(stu.age)  # 10

可以通过元类实现,代码如下:

class Meta(type):
    def __new__(cls, name, parents, attrs):
        kvs = [[k, v] for k, v in attrs.items() if not k.startswith('__')]  # 找到自定义的属性age
        for kv in kvs:
            attrs[kv[0]] += 10  # age+10
        return super(Meta, cls).__new__(cls, name, parents, attrs)


class Stdent(metaclass=Meta):
    age = 10

stu = Stdent()
print(stu.age)  # 20

现在又新增一个需求,需要让Student继承Person类,从而能够使用Person类的方法say

class Person(object):
    def say(self):
        print('我是一个人')

实现代码如下:

class Stdent(Person,metaclass=Meta):
    age = 10

stu = Stdent()
print(stu.age)  # 20
stu.say()  # '我是一个人

这样,Stdent的对象既有say方法,又能实现age自加10。

此外,参考wtfForms源码,还有另外一种实现方式:

stu_plus = Meta('stu_plus', (Person, ), {})
class Stdent(stu_plus):
    age = 10
    
stu = Stdent()
print(stu.age)  # 20
stu.say()  # '我是一个人'
上一篇 下一篇

猜你喜欢

热点阅读