Di Python, apakah ada cara untuk mendeklarasikan antarmuka seperti kelas dengan daftar atribut, selain dari namatuple? Saya ingin membuat mixin dari daftar nama atribut. Upaya terbaik saya sejauh ini adalah:
# module1.py (user facing)
CUSTOM_FIELDS = ['eye_color', 'shoe_size']
# module2.py (inside my framework)
from collections import namedtuple
from typing import Union
class BasePerson:
name: Any
age: Any
CustomMixin = namedtuple('CustomMixin', CUSTOM_FIELDS)
Person = Union[BasePerson, CustomMixin]
# module3.py (user facing)
def f(a: Person):
# my objective is for IDEs like PyCharm to recognize a.eye_color and a.name
a.eye_color
a.name
Ini hampir sama, karena IDE mengenali atributnya. Tapi itu juga menunjukkan semua atribut lain untuk NamedTuple dan tuple (seperti _asdict
, dll).
Saya membutuhkan pengguna untuk mendefinisikan atribut sebagai daftar bidang, bukan dengan sintaks kelas reguler. Pertama, untuk konsistensi dengan kerangka saya yang lain. Kedua, menggunakan sintaks kelas akan membuka sekaleng worm, karena Anda dapat melakukan segala macam hal di kelas yang tidak diizinkan oleh kerangka kerja saya.
Saya juga mencoba:
class CustomMixin:
__slots__ = CUSTOM_FIELDS
Tapi PyCharm tidak mengenali ini. Saya juga melihat typing.Protocol
tetapi itu juga memerlukan deklarasi kelas.
dataclasses.make_dataclass()
dapat melakukan ini; lihat duplikatnya untuk gambaran umum tentang apa yang dilakukan moduldataclasses
. - person Martijn Pieters   schedule 18.02.2021type(_, _, _)
tetapi untuk kelas data, bukan? - person DeepSpace   schedule 18.02.2021type()
; input divalidasi, nama tanpa petunjuk tipe diberi petunjuktyping.Any
, dan dekorator@dataclass()
diterapkan pada hasil untuk menghasilkan metode seperti__init__
dan__repr__
, bergantung pada argumen yang digunakan. - person Martijn Pieters   schedule 18.02.2021type()
, fungsinya menggunakantypes.new_class()
, untuk menangani metaclass khusus dengan benar. - person Martijn Pieters   schedule 18.02.2021attrs
, yang mendukung Python 2.7, 3.5, dan yang lebih baru. - person Martijn Pieters   schedule 18.02.2021