python | 实验楼17楼挑战赛

题目一:不可修改字典

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__(),如果该元类没有重新该方法,则类的信息为
7)获取类的子类,可以调用类的__subclasses__()方法。但这个类必须显示继承一个有该方法的元类。

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

运行结果如下:

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

题目三:token认证功能

总结

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

你可能感兴趣的:(python | 实验楼17楼挑战赛)