一:对下面的代码的详细过程进行分析
1 class StarkConfig(object): 2 list_display = [] 3 4 def get_list_display(self): 5 self.list_display.insert(0,33) 6 return self.list_display 7 8 class RoleConfig(StarkConfig): 9 list_display = [11,22] 10 11 s1 = StarkConfig() 12 result1 = s1.get_list_display() 13 print(result1) # [33] 14 result2 = s1.get_list_display() 15 print(result2) # [33, 33]
1 class StarkConfig(object): 2 list_display = [] 3 4 def get_list_display(self): 5 self.list_display.insert(0,33) 6 return self.list_display 7 8 class RoleConfig(StarkConfig): 9 list_display = [11,22] 10 11 s1 = StarkConfig() 12 上面的这个是进行实例化的过程,在此过程中发生了什么?首先会调用该类的__new__()方法进行构造创建了对象 13 (实例)空间,此时还是个空的,然后在执行__init__()进行数据初始化,此时对象中的变量就是在此时定义。 14 而对象空间中会有指向类空间的指针,因此要区分好类变量和实例变量所在的空间。我们在操作时到底改没改 15 类变量就是看这个变量在实例变量中有没有,如果没有说明在__init__()中没有此变量。因此针对此题, 16 就可以很轻松的知道为什么会有这样的答案了。 17 18 19 result1 = s1.get_list_display() 20 print(result1) # [33] 21 result2 = s1.get_list_display() 22 print(result2) # [33, 33]
二:看代码写答案
1 class Base: 2 3 @classmethod 4 def f3(cls): 5 print(cls) 6 7 def f1(self): 8 print('base.f1') 9 self.f3() 10 11 class Foo(Base): 12 13 def f2(self): 14 print('foo.f2') 15 self.f1() 16 17 obj = Foo() 18 obj.f2() 19 20 答案: 21 foo.f2 22 base.f1 23 <class '__main__.Foo'>
针对此题的分析:
此题的关键在于self,obj.f2()首先会调用Foo的f2所以打印foo.f2,然后调用self.f1(),self是obj,obj是Foo(),先从Foo类寻找,没有 再去找父类Base,找到f1,此时参数self依旧是obj,然后打印'base.f1,在然后self.f3(),先是去Foo寻找(因为self是Foo类的对象), 没有找到,再去父类Base里找,找到后,f3()是类方法,因此cls参数是类名,这个类名从self.f3()可以确定来源于Foo
三:反射相关的案例:
如果有一下handler.py文件,请在 run.py中补充代码实现:
1 handler.py 2 3 class Base(object): 4 pass 5 6 class F1(Base): 7 pass 8 class F2(Base): 9 pass 10 class F3(F2): 11 pass 12 class F4(Base): 13 pass 14 class F5(object): 15 pass 16 class F6(F5): 17 pass
1: 获取handler中所有成员名称
1 import handler 2 def func(): 3 objs = [] 4 name_list = dir(handler) 5 print(name_list) 6 7 if __name__ == '__main__': 8 func() 9 10 答案:['Base', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']注意:这里获得的是字符串
2:获取handler中名字叫Base的成员
1 import handler 2 def func(): 3 objs = [] 4 name_list = dir(handler) #注意这里获得的是字符串 5 for item in name_list: 6 if item == 'Base': 7 print(item) 8 break 9 else: 10 print("没有") 11 if __name__ == '__main__': 12 func()
3:检查其他成员是否是Base类的子类(不包含Base),如果是则创建对象并添加到objs列表中
1 import handler 2 3 def func(): 4 objs = [] 5 name_list = dir(handler) 6 func_b = getattr(handler, 'Base') 7 for item in name_list: #注意这里的item是字符串 8 if item != 'Base': 9 func_a = getattr(handler, item) #找到映射关系 10 if type(func_a) == type: #这个是判断是否是类的方法 11 if issubclass(func_a,func_b): 12 objs.append(func_a()) 13 print(objs) 14 return objs
四:看代码写结果
1 class Foo: 2 def __init__(self): 3 self.name = 'li' 4 self.age = 100 5 obj = Foo() 6 setattr(Foo,'email','lilz@qq.com') 7 print(obj.__dict__) #{'name': 'li', 'age': 100}#__dict__把对象封装中的数据以字典的方式输出 8 9 v1 = getattr(obj,'email') #obj.email 10 v2 = getattr(Foo,'email') #Foo.email 11 print(v1,v2) #lilz@qq.com lilz@qq.com
浙公网安备 33010602011771号