Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penghias dan Penetap dalam Python

Penghias dan Penetap dalam Python

PHPz
PHPzasal
2024-08-06 03:46:531037semak imbas

Decorator Getters and Setters in Python

Satu jenis penghias ialah pemeroleh dan penetap harta. Penghias ini membenarkan akses terkawal kepada pembolehubah dalam keadaan kelas.

Pendapat dan penetap harta direka khusus untuk mengawal atribut dalam pengaturcaraan berorientasikan objek. Ini berbeza daripada penghias fungsi kerana ia digunakan untuk atribut kelas (lihat siaran saya tentang penghias fungsi di sini).

Kedua-dua penghias fungsi dan penghias pengambil dan penetap harta mengubah suai kod dengan kod boleh guna semula dan menggunakan sintaks '@'. Kedua-duanya menukar fungsi kod.

Baiklah, mari kita mulakan.

Pendapat dan penetap harta digunakan pada kaedah dalam kelas untuk mentakrifkan pelbagai gelagat. setter menetapkan atribut kepada nilai dan getter mengambil atribut daripada kelas. Atribut ialah tetapkan dahulu.

Mari kita lihat contoh, dan kemudian kita akan memecahkannya:

class Shoe:
    def __init__(self, brand = "Adidas", size = 9):
        self.brand = brand
        self.size = size
        self._condition = "New"

    @property
    def size(self):
        """The size property"""
        return self._size

    @size.setter
    def size(self, size):
        """size must be an integer"""
        if isinstance(size, int):
            self._size = size
        else:
            print("size must be an integer")

    def cobble(self):
        """Repairs the shoe and sets the condition to 'New'."""
        self.condition = "New"
        print("Your shoe is as good as new!")

    @property
    def condition(self):
        """The condition property"""
        return self._condition

    @condition.setter
    def condition(self, condition):
        self._condition = condition

Mari kita lihat beberapa kod ini:

garis bawah sebelum beberapa atribut (keadaan, saiz) menunjukkan kepada pembangun bahawa ia adalah peribadi; ia khusus untuk setiap tika kelas Kasut (setiap kasut, huruf kecil).

Anda mungkin perasan bahawa keadaan dan saiz dibuat secara berbeza. self._condition = "Baru" bermaksud bahawa setiap contoh (atau objek) kelas kasut dijadikan instantiated dengan keadaan "Baru". Perkara yang sama dilakukan untuk atribut saiz, tetapi ia tidak ditulis sebagai diri._size = 9 supaya ia akan mencetuskan pengesahan sifat penetap, kerana saiz perlu menjadi integer (ini adalah proses yang dipanggil pengesahan). Kami menetapkan keadaan setiap objek kasut individu secara langsung, bukannya menjalankannya melalui kaedah penetap dan pengambil harta.

Kaedah cobble tidak memerlukan penghias kerana ia hanya melakukan tindakan, tidak mendapatkan/menetapkan atribut setiap objek kasut.

Mari kita lakukan satu perubahan terakhir pada kod kita. Sebagai contoh, bagaimana jika kita ingin memastikan atribut saiz tidak boleh diubah kemudian? Lagipun, kasut tidak berubah saiznya, bukan?

Kita boleh menggunakan fungsi hasattr() untuk melakukan pemeriksaan pada setiap objek kasut. Adakah ia mempunyai atribut saiz peribadi, yang ditunjukkan oleh kehadiran '_size'? Jika ya, ia tidak boleh diubah. Berikut ialah kod yang dilaksanakan:

 @size.setter
    def size(self, size):
        """size must be an integer and can't be changed once set"""
        if hasattr(self, '_size'):
            raise AttributeError("Can't change size once set")
        if isinstance(size, int):
            self._size = size
        else:
            raise ValueError("size must be an integer")

Penetap dan pengambil hartanah agak mencabar untuk difahami, tetapi setelah difahami, anda akan mengekod Python seperti seorang profesional!

Sumber:

Bahan sekolah flatiron

Atas ialah kandungan terperinci Penghias dan Penetap dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn