有時,我們抽象出一個基類,知道要有哪些方法,但只是抽象方法,並不實現功能,只能繼承,
而不能被實例化,但子類必須要實現該方法。看下面的例子:
import abc class Foo(abc.ABC): @abc.abstractmethod def fun(self): pass a = Foo() # 實例化報錯 # TypeError: Can't instantiate abstract class Foo with abstract methods fun
下面子類繼承該方法
class Sub_foo(Foo): def f(self): print('This is sub foo!') c = Sub_foo() # 子類並沒有實現fun 方法,實例化子類sub_foo同樣報錯 # TypeError: Can't instantiate abstract class Sub_foo with abstract methods fun
我們在子類實現fun方法:
class Sub_foo(Foo): def fun(self): print("From sub_foo") def f(self): print('This is sub foo!') c = Sub_foo() c.fun() c.f()
輸出:
From sub_foo This is sub foo!
但是注意,如果這時你實例化Foo,仍然是報錯的,因為抽象基類只能繼承而不能實例化,子類要實例化
必須先實現該方法。
為了理解抽象基類,你可以這樣想,我們有水果這個抽象基類,有蘋果,香蕉,桃子類等,但你永遠只能
吃得到蘋果,桃子這些,而不能吃到所謂的“水果”。