Ini adalah kasus lain dari pylint
aturan buta.
"Kelas tidak dimaksudkan untuk menyimpan data" - ini adalah pernyataan yang salah. Kamus tidak bagus untuk segalanya. Anggota data kelas adalah sesuatu yang berarti, item kamus adalah sesuatu yang opsional. Bukti: Anda dapat melakukannya dictionary.get('key', DEFAULT_VALUE)
untuk mencegah KeyError
, tetapi tidak ada yang sederhana __getattr__
dengan default.
EDIT - cara yang disarankan untuk menggunakan struct
Saya perlu memperbarui jawaban saya. Sekarang - jika Anda membutuhkan filestruct
, Anda memiliki dua opsi bagus:
a) Gunakan saja attrs
Ini adalah perpustakaan untuk itu:
https://www.attrs.org/en/stable/
import attr
@attr.s
class MyClass(object): # or just MyClass: for Python 3
foo = attr.ib()
bar = attr.ib()
Apa yang Anda dapatkan ekstra: tidak menulis konstruktor, nilai default, validasi,, __repr__
objek hanya-baca (untuk menggantinamedtuples
, bahkan dengan Python 2) dan banyak lagi.
b) Gunakan dataclasses
(Py 3.7+)
Mengikuti komentar hwjp, saya juga merekomendasikan dataclasses
:
https://docs.python.org/3/library/dataclasses.html
Ini hampir sebagus attrs
, dan merupakan mekanisme pustaka standar ("termasuk baterai"), tanpa ketergantungan tambahan, kecuali Python 3.7+.
Sisa jawaban Sebelumnya
NamedTuple
tidak bagus - terutama sebelum python 3 typing.NamedTuple
:
https://docs.python.org/3/library/typing.html#typing.NamedTuple
- Anda harus memeriksa pola "kelas yang diturunkan dari NamedTuple
". Python 2 -namedtuples
dibuat dari deskripsi string - jelek, buruk dan "pemrograman di dalam string literal" bodoh.
Saya setuju dengan dua jawaban saat ini ("pertimbangkan untuk menggunakan sesuatu yang lain, tetapi pilint tidak selalu benar" - yang diterima, dan "gunakan komentar penekan pilek"), tetapi saya punya saran sendiri.
Izinkan saya menunjukkan ini sekali lagi: Beberapa kelas dimaksudkan hanya untuk menyimpan data.
Sekarang opsi untuk juga mempertimbangkan - gunakan property
-ies.
class MyClass(object):
def __init__(self, foo, bar):
self._foo = foo
self._bar = bar
@property
def foo(self):
return self._foo
@property
def bar(self):
return self._bar
Di atas Anda memiliki properti hanya-baca, yang OK untuk Objek Nilai (misalnya seperti yang ada di Desain Didorong Domain), tetapi Anda juga dapat menyediakan penyetel - dengan cara ini kelas Anda akan dapat mengambil tanggung jawab atas bidang yang Anda miliki - misalnya untuk melakukan beberapa validasi, dll. (jika Anda memiliki penyetel, Anda dapat menetapkan menggunakannya dalam konstruktor, yaitu self.foo = foo
alih-alih langsung self._foo = foo
, tapi hati-hati, penyetel mungkin menganggap bidang lain sudah diinisialisasi, dan kemudian Anda memerlukan validasi kustom dalam konstruktor) .