Di aplikasi Python saya, saya ingin membuat metode a staticmethod
dan abc.abstractmethod
. Bagaimana saya melakukan ini?
Saya mencoba menerapkan kedua dekorator, tetapi tidak berhasil. Jika saya melakukan ini:
import abc
class C(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
@staticmethod
def my_function(): pass
Saya mendapatkan pengecualian *, dan jika saya melakukan ini:
class C(object):
__metaclass__ = abc.ABCMeta
@staticmethod
@abc.abstractmethod
def my_function(): pass
Metode abstrak tidak dipaksakan.
Bagaimana cara membuat metode statis abstrak?
* Pengecualian:
File "c:\Python26\Lib\abc.py", line 29, in abstractmethod
funcobj.__isabstractmethod__ = True
AttributeError: 'staticmethod' object has no attribute '__isabstractmethod__'
python
abstract-class
static-methods
Ram Rachum
sumber
sumber
Jawaban:
sumber
import abc
di bagian atas; serta subclass yang menunjukkan instansiasi A. (misalnya,class B(A):\n @staticmethod\n def test():\n print 10\n
)__isabstractmethod__
atribut.abstractstatic
ditambahkan ke huluabc.py
?Dimulai dengan Python 3.3 , dimungkinkan untuk menggabungkan
@staticmethod
dan@abstractmethod
, jadi tidak ada lagi saran lain yang diperlukan:sumber
@staticmethod
sebagai yang pertama, atau Anda akan mendapatkanAttributeError: attribute '__isabstractmethod__' of 'staticmethod' objects is not writable
@property
Ini akan melakukannya:
Anda berkata "Eh? Ini hanya mengganti nama @abstractmethod", dan ini sepenuhnya benar. Karena setiap subclass di atas harus menyertakan dekorator @staticmethod. Anda tidak membutuhkannya di sini, kecuali sebagai dokumentasi saat membaca kode. Sebuah subclass harus terlihat seperti ini:
Untuk memiliki fungsi yang akan memaksa Anda untuk membuat metode ini sebagai metode statis, Anda harus subclass ABCmeta untuk memeriksanya dan menerapkannya. Itu banyak pekerjaan tanpa pengembalian nyata. (Jika seseorang lupa dekorator @staticmethod mereka akan mendapatkan kesalahan yang jelas, itu tidak akan menyebutkan metode statis.
Jadi sebenarnya ini bekerja dengan baik:
Perbarui - Cara lain untuk menjelaskannya:
Bahwa metode adalah kontrol statis bagaimana dipanggil. Metode abstrak tidak pernah dipanggil. Dan metode statis abstrak karena itu merupakan konsep yang tidak berguna, kecuali untuk tujuan dokumentasi.
sumber
Ini saat ini tidak memungkinkan di Python 2.X, yang hanya akan memberlakukan metode menjadi abstrak atau statis, tetapi tidak keduanya.
Dalam Python 3.2+, dekorator baru
abc.abstractclassmethod
danabc.abstractstaticmethod
ditambahkan untuk menggabungkan penegakannya menjadi abstrak dan statis atau abstrak dan metode kelas.Lihat Masalah Python 5867
sumber
abstractclassmethod
danabstractstaticmethod
dengan cepat ditinggalkan di Python 3.3, jugaabstractproperty
. docs.python.org/3/library/abc.html