2017-10-13 67 views
0

使用ABC,我可以使用以下命令來創建抽象類:如何在不使用抽象方法的情況下使用abc創建抽象類?

from abc import ABC, abstractmethod 
class A(ABC): 
    @abstractmethod 
    def foo(self): 
     print('foo') 
class B(A): 
    pass 

obj = B() 

因爲B沒有定義的方法foo這將失敗。 這模仿了Java中的抽象方法功能。

我想知道抽象類的功能是否也存在於Python中,在沒有任何抽象方法的情況下阻止實例化一個類。

+0

我不明白你的問題。 「在沒有任何抽象方法的情況下阻止實例化類的地方」是什麼意思?你想強制這個類來實現abstractmethods? – Vinny

+0

在Java中,抽象方法和抽象類是兩個不同的概念。抽象方法應該由子類定義,抽象類不能實例化。但在python的abc模塊中(據我瞭解)兩者都綁在一起。有沒有一種方法來定義抽象類,而不用像抽象方法那樣裝飾任何方法? –

回答

0

一個簡單的方法來防止initalizing一個抽象類是:

class Abs(object): 
    def __init__(self, *args, **kwargs): 
     raise NotImplementedError('abstract class can not be initalized') 

    def some_func(self): 
     raise NotImplementedError 

這將提高與信息消息的異常,不會讓你的類中initalized。爲了創建這樣的對象的實例,子類化是必需的。

該方法是一個抽象太:

[...]在用戶定義的基類,抽象方法提高此異常時它們需要派生類覆蓋的方法,或者正在開發該類以指示仍需要添加真正的實現。

這是將方法聲明爲抽象的另一種方法。如果B類未覆蓋foo方法,而raise NotImplementedError僅在執行時失敗,而不是在創建實例對象時失敗,則差異爲@abstractmethod將提高TypeError: Can't instantiate abstract class B with abstract methods foo

0

在Python中創建抽象類的傳統方法是引發內置的異常NotImplementedError

class A(object): 
    def __init__(self): 
     raise NotImplementedError('abstract base class') 

class B(A): 
    def __init__(self): 
     # don't call A.__init__ here. 
     pass 

b = B() 
# a = A() # This will fail.