Python是一种动态语言,动态语言中没有变量类型。在Python中,变量只是一个符号,它可以指向任何类型的对象。不推荐使用抽象基类。1.检查类中是否存在方法classCompany(object):def__init__(self,employee_list):self.employee=employee_listdef__len__(self):returnlen(self.employee)com=Company(['123','234'])print(hasattr(com,'__len__'))#True上面是一个普通的方法,下面是一个抽象基类2.有些情况下,你想从collections.abc中判断一个对象的类型importSizedprint(isinstance(com,Sized))#SizedinTruecollections.abc源代码classSized(metaclass=ABCMeta):__slots__=()@abstractmethoddef__len__(self):return0@classmethoddef__subclasshook__(cls,C):如果cls是Sized:返回_check_methods(C,"__len__")返回NotImplemented3。强制子类实现某些方法。例如:实现一个web框架,继承缓存(redis、cache、memorycache)需要设计一个抽象基类,指定子类必须实现某些方法。首先实现一个基类classCacheBase():defget(self,key):raiseNotImplementedErrordefset(self,key,value):raiseNotImplementedErrorclassRedisCache(CacheBase):passredis_cache=RedisCache()redis_cache.set('key','value')#运行结果会执行基类中的方法并抛出异常classRedisCache(CacheBase):defset(self,key,value):passredis_cache=RedisCache()redis_cache.set('key','value')#如果子类中实现了基类中的方法,则不会抛出异常。使用abc抽象基类实现importabcclassCacheBase(metaclass=abc.ABCMeta):@abc.abstractmethoddefget(self,key):pass@abc.abstractmethoddefset(self,key,value):passclassRedisCache(CacheBase):passredis_cache=RedisCache()#使用abc抽象基类实现,如果子类没有实现基类中的方法,实例化子类classRedisCache(CacheBase)时会报错:defget(self,key):passdefset(self,key,value):pass#使用abc抽象基类实现基类中的方法,实例化子类时不会报错
