练习题及补充

练习题

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()
       
原文地址:https://www.cnblogs.com/yangzilaing/p/14097436.html