知识储备:
元类的作用:拦截类的创建,做一些自定义的操作,并将修改过的类返回给调用者。
案例演示:
现在有一个类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() # '我是一个人'
网友评论