Dalam kode berikut, saya membuat kelas abstrak dasar Base
. Saya ingin semua kelas yang diwarisi Base
menyediakan name
properti, jadi saya menjadikan properti ini sebagai @abstractmethod
.
Kemudian saya membuat subclass dari Base
, disebut Base_1
, yang dimaksudkan untuk menyediakan beberapa fungsionalitas, tetapi tetap abstrak. Tidak ada name
properti di Base_1
, namun python membuat objek dari kelas itu tanpa kesalahan. Bagaimana cara membuat properti abstrak?
from abc import ABCMeta, abstractmethod
class Base(object):
__metaclass__ = ABCMeta
def __init__(self, strDirConfig):
self.strDirConfig = strDirConfig
@abstractmethod
def _doStuff(self, signals):
pass
@property
@abstractmethod
def name(self):
#this property will be supplied by the inheriting classes
#individually
pass
class Base_1(Base):
__metaclass__ = ABCMeta
# this class does not provide the name property, should raise an error
def __init__(self, strDirConfig):
super(Base_1, self).__init__(strDirConfig)
def _doStuff(self, signals):
print 'Base_1 does stuff'
class C(Base_1):
@property
def name(self):
return 'class C'
if __name__ == '__main__':
b1 = Base_1('abc')
python
properties
abstract-class
decorator
Boris Gorelik
sumber
sumber
@property
diclass C
,name
akan kembali ke metode.Jawaban:
Sejak Python 3.3 bug telah diperbaiki yang berarti
property()
dekorator sekarang diidentifikasi dengan benar sebagai abstrak ketika diterapkan ke metode abstrak.Catatan: Urutan penting, Anda harus menggunakan
@property
sebelumnya@abstractmethod
Python 3.3+: ( python docs ):
Python 2: ( dokumen python )
sumber
Hingga Python 3.3 , Anda tidak dapat menumpuk
@abstractmethod
dan@property
.Gunakan
@abstractproperty
untuk membuat properti abstrak ( dokumen ).Kode sekarang memunculkan pengecualian yang benar:
sumber
@abstractproperty
sudah tidak digunakan lagi untuk kombinasi seperti OP.raise NotImplementedError
Berdasarkan jawaban James di atas
dan menggunakannya sebagai dekorator
sumber