Kawalan akses hartanah

Seperti yang dinyatakan sebelum ini, Python tidak mempunyai sifat peribadi sebenar. Ini kemudiannya membawa kepada enkapsulasi kelas Python yang lemah. Kami kadang-kadang mahu Python dapat mentakrifkan sifat peribadi dan kemudian menyediakan kaedah dapatkan dan set kaedah yang boleh diakses secara umum. Python sebenarnya boleh mencapai enkapsulasi melalui kaedah sihir.

KaedahPenerangan
__getattr__(diri, nama) Kaedah ini mentakrifkan tingkah laku apabila anda cuba mengakses atribut yang tidak wujud. Oleh itu, melebihkan kaedah ini boleh menangkap salah ejaan dan mengubah halanya, atau memberi amaran tentang beberapa atribut yang tidak digunakan lagi.
__setattr__(diri, nama, nilai) mentakrifkan tingkah laku semasa menetapkan dan mengubah suai atribut. Tidak kira sama ada atribut objek wujud, penetapan kepada atribut dibenarkan Satu perkara yang perlu diambil perhatian ialah apabila melaksanakan __setattr__, anda mesti mengelakkan ralat "rekursi tak terhingga",
__delattr__(diri, nama) __delattr__ dan _ _setattr__ sangat serupa, kecuali ia mentakrifkan tingkah laku apabila anda memadamkan atribut. Melaksanakan __delattr__ adalah untuk mengelakkan ralat "rekursi tak terhingga" pada masa yang sama
__getattribute__(self, name) __getattribute__ mentakrifkan tingkah laku apabila atribut anda diakses. Sebagai perbandingan, __getattr__ hanya akan dicetuskan apabila atribut itu tidak wujud kesan. Oleh itu, dalam versi Python yang menyokong __getattribute__, __getattribute__``__getattribute__ mesti dipanggil sebelum memanggil __getattr__ untuk mengelakkan ralat "rekursi tak terhingga".

Seperti yang anda lihat daripada jadual kaedah di atas, anda boleh menyebabkan ralat dengan mudah semasa menentukan kawalan akses atribut Anda boleh lihat contoh berikut:

def __setattr__(self, name, value):
    self.name = value
    # 每当属性被赋值的时候, ``__setattr__()`` 会被调用,这样就造成了递归调用。
    # 这意味这会调用 ``self.__setattr__('name', value)`` ,每次方法会调用自己。这样会造成程序崩溃。
def __setattr__(self, name, value):
    # 给类中的属性名分配值
    self.__dict__[name] = value  
    # 定制特有属性

Contoh khusus untuk memanggil kaedah di atas adalah seperti. berikut:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
class User(object):
    def __getattr__(self, name):
        print('调用了 __getattr__ 方法')
        return super(User, self).__getattr__(name)
    def __setattr__(self, name, value):
        print('调用了 __setattr__ 方法')
        return super(User, self).__setattr__(name, value)
    def __delattr__(self, name):
        print('调用了 __delattr__ 方法')
        return super(User, self).__delattr__(name)
    def __getattribute__(self, name):
        print('调用了 __getattribute__ 方法')
        return super(User, self).__getattribute__(name)
if __name__ == '__main__':
    user = User()
    # 设置属性值,会调用 __setattr__
    user.attr1 = True
    # 属性存在,只有__getattribute__调用
    user.attr1
    try:
        # 属性不存在, 先调用__getattribute__, 后调用__getattr__
        user.attr2
    except AttributeError:
        pass
    # __delattr__调用
    del user.attr1

Hasil keluaran:

调用了 __setattr__ 方法
调用了 __getattribute__ 方法
调用了 __getattribute__ 方法
调用了 __getattr__ 方法
调用了 __delattr__ 方法
Meneruskan pembelajaran
  • Cadangan kursus
  • Muat turun perisian kursus