题目一:不可修改字典
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的特殊方法、元类创建类的方法、装饰器。写了很多业务代码的同学,其实可以花点时间了解这些方面的知识,也是蛮有趣的。
网友评论