1 # 1. 2 # 元编程产生一个类,将所有实例方法名,都转成大写调用,如 3 # 目前会返回true,现在改成必须大写调用,应返回false。 4 # 元类会自动将你通常传给‘type’的参数作为自己的参数传入 5 class Uppers(type): 6 def __new__(cls, names, bases, attrs): 7 # print(attrs) 8 d = {} 9 for k,v in attrs.items(): 10 if not (k.startswith('__') and k.endswith('__')): 11 d[k.upper()] = v 12 else: 13 d[k] = v 14 print("元类new方法执行") 15 return super().__new__(cls, names,bases,d) 16 class A(metaclass=Uppers): 17 def funa(self): 18 print("实例方法a") 19 def funb(self): 20 print("实例方法b") 21 def func(self): 22 print("实例方法c") 23 24 b=A() 25 # b.funa() 26 print(hasattr(A, 'funa'))#Flase 27 # b.FUNA() 28 print(hasattr(A, 'FUNA'))#True 29 print(hasattr(A, 'FUNB'))#True
1 # 2.创建元类,用来检测类中定义的属性,如果任何attr属性名中包含“x”字母,则输出错误信息。 2 # def __new__(cls, name, bases, attr) attr就是属性名 3 # 自己尝试一下这个属性名到底能对谁起作用?类方法名,实例方法名,类属性,实例属性,静态方法? 4 class Xtype(type): 5 def __new__(cls, names, bases, attrs): 6 7 for k,v in attrs.items(): 8 if not (k.startswith('__') and k.endswith('__')): 9 if "x" in k: 10 raise NameError("报错") 11 print("Xtype元类new方法执行") 12 return super().__new__(cls, names,bases,attrs) 13 # class X(metaclass=Xtype): 14 # xdesc = "类属性有x"#类属性起作用 报错 15 # desc = "类属性无x" 16 17 # def __init__(self,xname): 18 # self.xname=xname #实例属性不起作用 19 20 # def xfuns(self): 21 # print("实例方法")#实例方法起作用 22 23 # @classmethod 24 # def xfunl(cls): 25 # print("类方法")#类方法起作用 26 # 27 # @staticmethod 28 # def xfunj(): 29 # print("静态方法")#静态方法起作用 30 # 31 32 # X.xdesc#类属性 起作用,存在x报错 33 # X.desc 34 35 36 # c1=X("x") 37 # c1.xname#实例属性---不起作用 38 39 # c2=X() 40 # c2.xfuns()#实例方法起作用 41 42 # X.xfunl()#类方法起作用 43 44 # X.xfunj()#静态方法起作用