面向对象-元类介绍
储备知识exec
参数1:字符串形式的命令
参数2:全局作用域(字典形式),如果不指定默认就使用globals()
参数3:局部作用域(字典形式)如果不指定默认就使用locals()
g={ 'x':1, 'y':2 } l={} exec(""" global x,m x=10 m=100 z=3 """,g,l) print(g) print(l) print(g)
一切皆对象,对象可以怎么用?
1、被引用,x=obj
2、都可以当做函数的参数传入
3、都可以当做函数的返回值
4、都可以当做容器类的元素,l=[func,time,obj,1]
类也是对象,查看类型,type
class Foo: pass obj=Foo() print(type(obj)) print(type(Foo)) class Bar: pass print(type(Bar))
产生类的类称之为元类,默认所有用class定义的类,他们的元类都是type
方式一:class
class Chinese: country='China' def __init__(self,name,age): self.name=name self.age=age def talk(self): print('%s is talking'%self.name) # print(Chinese) obj=Chinese('egon',18) print(obj,obj.name,obj.age)
方式二:type
定义类的三要素:类名,类的基类,类的名称空间
class_name='Chinese' class_bases=(object,) class_body=""" country='China' def __init__(self,name,age): self.name=name self.age=age def talk(self): print('%s is talking'%self.name) """ class_dic={} exec(class_body,globals(),class_dic) print(class_dic) Chinese1=type(class_name,class_bases,class_dic) # print(Chinese1) obj1=Chinese1('egon',18) print(obj1,obj1.name,obj1.age)
如何定制元类 来控制类的行为
class Mymeta(type): def __init__(self,class_name,class_bases,class_dic): print(class_name) print(class_bases) print(class_dic) if not class_name.istitle(): raise TypeError('类名的首字母必须大写') if '__doc__' not in class_dic or not class_dic['__doc__'].strip(): raise TypeError('必须有注释,且注释不能为空') super(Mymeta,self).__init__(class_name,class_bases,class_dic) class Chinese(object,metaclass=Mymeta): """ 注释 """ country='China' def __init__(self,name,age): self.name=name self.age=age def talk(self): print('%s is talking'%self.name) # Chinese=type(class_name,class_bases,class_dic)