亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

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
    # 每當(dāng)屬性被賦值的時候, ``__setattr__()`` 會被調(diào)用,這樣就造成了遞歸調(diào)用。
    # 這意味這會調(diào)用 ``self.__setattr__('name', value)`` ,每次方法會調(diào)用自己。這樣會造成程序崩潰。
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('調(diào)用了 __getattr__ 方法')
        return super(User, self).__getattr__(name)
    def __setattr__(self, name, value):
        print('調(diào)用了 __setattr__ 方法')
        return super(User, self).__setattr__(name, value)
    def __delattr__(self, name):
        print('調(diào)用了 __delattr__ 方法')
        return super(User, self).__delattr__(name)
    def __getattribute__(self, name):
        print('調(diào)用了 __getattribute__ 方法')
        return super(User, self).__getattribute__(name)
if __name__ == '__main__':
    user = User()
    # 設(shè)置屬性值,會調(diào)用 __setattr__
    user.attr1 = True
    # 屬性存在,只有__getattribute__調(diào)用
    user.attr1
    try:
        # 屬性不存在, 先調(diào)用__getattribute__, 后調(diào)用__getattr__
        user.attr2
    except AttributeError:
        pass
    # __delattr__調(diào)用
    del user.attr1

Hasil keluaran:

調(diào)用了 __setattr__ 方法
調(diào)用了 __getattribute__ 方法
調(diào)用了 __getattribute__ 方法
調(diào)用了 __getattr__ 方法
調(diào)用了 __delattr__ 方法
Meneruskan pembelajaran