angrykola

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

抽象超类: 

>>> class Super():        #建立一个抽象超类
    def display(self):
        self.action()
    def action(self):     #这是一个抽象方法
        raise NotImplementedError('aciton must be defined') #raise强制抛出异常
>>> class Subclass(Super):   #建立子类,并且补全抽象方法
    def action(self):
        print('This is Subclass')    
>>> test = Super()
>>> test.display()
...
NotImplementedError: aciton must be defined
>>> tes=Subclass()    #建立子类对象实例
>>> tes.display()
This is Subclass

声明一个抽象超类:

#python3.0
from abc import ABCMeta,abstractmethod
>>> class Super(metaclass=ABCMeta):    #通过关键字参数 metaclass=ABCMeta  和 下面的 @特殊装饰器语法做一个抽象声明                         
           @abstractmethod
    def method(self):
        pass    
>>> x=Super()                          #声明后的抽象超类无法创建实例对象
...
TypeError: Can't instantiate abstract class Super with abstract methods method
>>> 
>>> class Subclass(Super):
    pass
>>> y=Subclass()         #子类必须覆写抽象超类中的抽象方法,否则还是会抛出TypeError
...
TypeError: Can't instantiate abstract class Subclass with abstract methods method

>>> class SubClass(Super):
    def method(self):
        print('class is over.')

        
>>> z = SubClass()
>>> z.method()
class is over.


#python2.6 方式略有不同
class Super():
    __metaclass__ = ABCMeta
    def method(self):
        pass

查询类属性:

>>> z.__dict__
{}
>>> z.__class__
<class '__main__.SubClass'>
>>> SubClass.__bases__  #__bases__ 查询超类
(<class '__main__.Super'>,)
>>> Super.__bases__
(<class 'object'>,)

 

posted on 2013-11-14 21:14  kolaman  阅读(559)  评论(0)    收藏  举报