美文网首页
python | 实验楼17楼挑战赛

python | 实验楼17楼挑战赛

作者: 君子月满楼 | 来源:发表于2017-12-24 15:19 被阅读84次

    题目一:不可修改字典

    class ImmutableDict(dict):
        """不可修改字典"""
            kk = {}
        def __init__(self):
            super(ImmutableDict, self).__init__()
    
        def __getitem__(self, key):
            print "__getitem__"
            if self.kk.has_key(key):
                return self.kk[key]
            else:
                return 'no key'
            
        def __setitem__(self, key, value):
            print "__setitem__"
            if self.kk.has_key(key):
                print 'ImmutableDict'
            else:
                self.kk[key] = value
    

    如下,可以看出当我们调用实例的某个key和设置key对应value时,调用的是__getitem()__,__setitem()__方法。

    >>> from immutableDict import ImmutableDict
    >>> a = ImmutableDict()
    >>> a['a']=1
    __setitem__
    >>> a['a']=2
    __setitem__
    ImmutableDict
    >>> print a['a']
    __getitem__
    1
    >>> print a['b']
    __getitem__
    no key
    

    题目二:自动注册子类

    实现一个名为Base类,任何继承自Base的子类都会被记录,且通过Base输出所有子类名称。

    class A(Base):
          pass
    class B(Base):
          pass
    >>> for cls in Base:
                 print cls
    A
    B
    >>>A in list(Base)
    True
    >>>B in list(Base)
    True
    

    答题:
    base.py

    # _*_ encoding:utf-8 _*_
    
    class MyMeta(type):
    
        def __new__(cls,name,attr1,attr2):
            return type.__new__(cls,name,attr1,attr2)
        
        def __iter__(cls):
            return iter(cls.__subclasses__())
    
        def __str__(cls):
            return cls.__name__
    
    class Base(object):
        __metaclass__ = MyMeta
    
    class A(Base):
        pass
    
    class B(Base):
        pass
    
    
    for cls in list(Base):
        print cls
    
    print  A in list(Base)
    print  B in list(Base)
    

    知识点:
    1)list(x) 调用的是实例对象的__iter__()方法。
    2)所有的类,都由元类创建,并且为创建该类的元类的一个实例对象。
    3)没有指定元类的类,元类都是type,这样的类都是一个type对象,而type对象未实现__iter__(),因此这样的类没有办法转换成list.
    4)只有实现了__iter__()方法的元类创建的类,才有可以直接使用list()
    5)元类使用__new__()方法创建元类。
    6)类被打印和输出时,其实是将类作为一个对象打印,也就是调用创建该类的元类的__str__(),如果该元类没有重新该方法,则类的信息为<class '__main__.X'>。
    7)获取类的子类,可以调用类的__subclasses__()方法。但这个类必须显示继承一个有该方法的元类。

    问题:python自定义元类可以不继承type吗?

    运行结果如下:

    appledeMacBook-Air:Documents apple$ python base.py 
    A
    B
    True
    True
    

    题目三:token认证功能

    总结

    这次赛题,主要考查了python的特殊方法、元类创建类的方法、装饰器。写了很多业务代码的同学,其实可以花点时间了解这些方面的知识,也是蛮有趣的。

    相关文章

      网友评论

          本文标题:python | 实验楼17楼挑战赛

          本文链接:https://www.haomeiwen.com/subject/rqnqgxtx.html