(day3)每日两题(Python编程基础题)补

 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()#静态方法起作用

猜你喜欢

转载自www.cnblogs.com/mengzhi7/p/9650628.html
今日推荐