Pertanyaan Python @properti desain


Sebuah pertanyaan desain tentang python @property, saya telah menemukan dua opsi ini:

Pilihan 1:

class ThisIsMyClass(object):

    @property
    def ClassAttr(self):
        ...

    @ClassAttr.setter
    def ClassAttr(self, value):
        ...

Pilihan 2:

class ThisIsMyClass(object):

    def set_ClassAttr(self, value):
        ...

    def get_ClassAttr(self):
        ...

    myProperty = property(get_ClassAttr, set_ClassAttr)

Pertanyaan:

Saya ingin tahu apakah ada perbedaan dengan menggunakan 2 opsi itu?

Jika demikian, bagaimana pengaruhnya terhadap kode saya?


5
2017-11-06 15:13


asal


Jawaban:


Mereka persis setara. Lihat dokumentasi untuk melihat sendiri:

http://docs.python.org/2/library/functions.html#property

Pilihan @ bagi saya lebih mudah dibaca (kode dalam dua garis yang berdekatan), lebih mudah untuk refactor (grep untuk semua @ dekorator dan melanjutkan), dan lebih mudah untuk diingat. Itu dimaksudkan sebagai gula sintaksis untuk metode kedua, dan saya akan menasihati saran itu.

Jika karena alasan apa pun Anda perlu mendukung versi Python yang tidak mendukung fungsi @ (2.6), maka Anda harus tetap menggunakan metode properti (opsi kedua).

Pada catatan yang tidak terkait: Saya menyarankan Anda untuk tetap menggunakan atribut anggota menggunakan kata kecil dipisahkan dengan garis bawah. Ini, tentu saja, masalah preferensi, tetapi sejajar dengan rekomendasi gaya Python (PEP8). Ada pengecualian penting untuk saran ini tetapi, jika Anda dapat membantu, tinggalkan huruf besar untuk nama kelas.


5
2017-11-06 15:33



Satu-satunya perbedaan adalah sintaks dan mengekspos nama lain menggunakan opsi kedua. Anda bisa, misalnya, gunakan obj.set_ClassAttr(value) dengan yang terakhir.

Opsi pertama yang digunakan tidak tersedia, karena sifat mendahului dekorator.


3
2017-11-06 15:19