python编程题(继承和元类)
2018-01-18 18:26
441 查看
1.实现不可修改的字典
2.自动注册子类
实现一个名为 Base 的类,且任何继承自 Base 子类将被记录,且可以通过迭代 Base 输出所有的子类名称。
两种思路:
1.直接通过
2.通过一个数据结构记录子类,并迭代
def is_immutable(self): raise TypeError('%r objects are immutable' % self.__class__.__name__) class ImmutableDict(dict): def setdefault(self, key, default=None): is_immutable(self) def update(self, *args, **kwargs): is_immutable(self) def pop(self, key, default=None): is_immutable(self) def popitem(self): is_immutable(self) def __setitem__(self, key, value): is_immutable(self) def __delitem__(self, key): is_immutable(self) def clear(self): is_immutable(self)
2.自动注册子类
实现一个名为 Base 的类,且任何继承自 Base 子类将被记录,且可以通过迭代 Base 输出所有的子类名称。
两种思路:
1.直接通过
__subclasses__()方法获取到子类,并用
__iter__迭代
#coding: utf-8 class IterableBase(type): def __iter__(cls): return iter(cls.__subclasses__()) def __str__(cls): return cls.__name__ class Base(metaclass=IterableBase): pass if __name__ == '__main__': class Lab(Base): pass class Course(Base): pass for cls in Base: print(cls)
2.通过一个数据结构记录子类,并迭代
class selfreigster(type): def __init__(cls, name, bases, dct): if not hasattr(cls, 'subclasses'): cls.subclasses = [] else: cls.subclasses.append(cls) super(selfreigster, cls).__init__(name, bases, dct) def __iter__(self): return iter(self.subclasses) def __str__(self): return self.__name__ class Base(object, metaclass=selfreigster): """docstring for Base""" if __name__ == '__main__': class Lab(Base): pass class Course(Base): pass for cls in Base: print(cls)
相关文章推荐
- Python基础(6)- 类和对象(使用、继承、派生、组合、接口、多态、封装、property、staticmethod、classmethod、反射、slots、上下文管理协议、元类)
- 【python】继承 定制 使用元类
- Python继承中的元类
- 【Python】__slots__ 、@property、多重继承、定制类、枚举类、元类
- Python学习_13_继承和元类
- python类的继承和多态
- Python自动化之模板继承和cookie
- python 命名空间字典 字典键 继承树的打印
- python3 继承(inheritance)
- python编程题:汉诺塔排序
- 2.1.4 Python继承
- Python 类继承,__bases__, __mro__, super
- python类的继承
- 10道Python编程题
- Python 面向对象(二)类的继承
- 初学Python的学习笔记11----使用元类、错误处理和调试
- 网易2017秋招编程题:计算糖果 [python]
- python | 面向对象 | 继承
- Python_类的继承
- python新式类多重继承 广度优先搜索 C3算法