练习题
class StarkConfig(object):
def __init__(self,num):
self.num = num
def changelist(self,request):
print(self.num,request)
class RoleConfig(StarkConfig):
def changelist(self,request):
print(666,self.num)
config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)]#R()封装了3,R的类中并没有__init__所以继承了S的init所以在调用self.num时就是封装的3
for item in config_obj_list:
item.changelist(168)
'''
1 168
2 168
666 3
'''
#第7题
class StarkConfig(object):
def __init__(self,num):
self.num = num
def changelist(self,request):
print(self.num,request)
def run(self):
self.changelist(999) #不是继承,而是直接调用的changelist函数,关键self的指示关系。
StarkConfig(1).run()
#第10题
class StarkConfig(object):
def __init__(self,num):
self.num = num
def changelist(self,request):
print(self.num,request)
def run(self):
self.changelist(999)
class RoleConfig(StarkConfig):
def changelist(self,request):
print(666,self.num)
class AdminSite(object):
def __init__(self):
self._registry = {}
def register(self,k,v):
self._registry[k] = v
site = AdminSite()
site.register('lyd',StarkConfig(19))
site.register('yjl',StarkConfig(20))
site.register('fgz',RoleConfig(33))
print(len(site._registry)) # 3
for k,row in site._registry.items():
row.run()
# 19 999
# 20 999
# 666 999 #此处还是比较有意义的要捋清楚继承与函数之间的关系,原则是什么:就是本着自己的就是最香的原则
#第11题
class UserInfo(object):
pass
class Department(object):
pass
class StarkConfig(object):
def __init__(self,num):
self.num = num
def changelist(self,request):
print(self.num,request)
def run(self):
self.changelist(999)
class RoleConfig(StarkConfig):
def changelist(self,request):
print(666,self.num)
class AdminSite(object):
def __init__(self):
self._registry = {} #依然预装好了一个空字典
def register(self,k,v):
self._registry[k] = v(k)
site = AdminSite()
site.register(UserInfo,StarkConfig) #疯了吧,往里面封了两个类(1,3)
site.register(Department,StarkConfig) #往里面封装了(2,3)两个类
print(len(site._registry))
for k,row in site._registry.items(): #不明白的是并没有实例化一个对象怎么就直接执行了???
row.run()
#StarkConfig(UserInfo).run
#StarkConfig(Department).run
#还蛮值得细细品味的
"""
输出结果:
2
<class '__main__.UserInfo'> 999
<class '__main__.Department'> 99
"""
#第12题
class F3(object):
def f1(self):
ret = super().f1() #按照继承顺序先先F3后F2
print(ret)
return(123)
class F2(object):
def f1(self):
print("123")
class F1(F3,F2):
pass
obj = F1()
obj.f1()
#应该特别注意super的用法
#第13题
class Base(object):
def __init__(self, name):
self.name = name
class Foo(Base):
def __init__(self, name):
super().__init__(name) #此处的__init_指的是什么???是父级的初始函数吗???如果是为什么输出的结果会是于大爷呢????答:确实是父级的初始函数,打印结果为“于大爷”是因为你在最后self.name重新进行了赋值
self.name = "于大爷"
obj1 = Foo('alex')
print(obj1.name)
obj2 = Base('alex')
print(obj2.name)
'''
输出结果为
于大爷
alex
'''
#第15题
class StarkConfig(object):
def __init__(self, num):
self.num = num
def __call__(self, *args, **kwargs): #**是否可以考虑不传参数???
print(self.num)
class RoleConfig(StarkConfig):
def __call__(self, *args, **kwargs):
print(self.num)
v1 = StarkConfig(1)
v2 = RoleConfig(11)
v1()
v2()
#
#第17题
class Context:
def __enter__(self):
print("进入")
return self #此处实际上是对ctx进行传参
def __exit__(self, exc_type, exc_val, exc_tb):
print("退出")
def do_something(self):
print("内部执行")
with Context() as ctx: #和ctx = Context()的区别是什么?当是后者是其只执行do_something的部分,
# 具体为什么会自动执行entr和exit,我想还是和with...as有关!
ctx.do_something()
#那么我是觉得18题是有点难的
#???????
练习题补充
#示例1:
class Foo():
print("123")
def func(self):
print("ayng")
'''
输出的结果为123
类内部在解释期间会执行,方法内部在解释期间不执行只有在调用期间才执行
'''
#进出栈
class Stack(object):
'''
后进先出
'''
def __init__(self):
self.data_list = []
def push(self,val):
'''
向栈中压入一个数据(入栈)
:param val:
:return:
'''
self.data_list.append(val)
def pop(self):
'''
从栈中拿走一个数据(出栈)
:return:
'''
return self.data_list.pop()