诚意
诚意如你,当一诚的态度对待

导航

 

一:对下面的代码的详细过程进行分析

 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]
View Code
 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'>
View Code

针对此题的分析:

此题的关键在于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
View Code

 

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
View Code

 

posted on 2018-08-30 17:44  诚意  阅读(130)  评论(0)    收藏  举报