Rumah >pembangunan bahagian belakang >Tutorial Python >Bolehkah Atribut Contoh Diluluskan sebagai Argumen kepada Penghias Kaedah Kelas dalam Python?

Bolehkah Atribut Contoh Diluluskan sebagai Argumen kepada Penghias Kaedah Kelas dalam Python?

Barbara Streisand
Barbara Streisandasal
2024-10-18 12:02:36931semak imbas

Can Instance Attributes be Passed as Arguments to Class Method Decorators in Python?

Melalui Medan Kelas kepada Penghias Kaedah Kelas

Dalam Python, kaedah kelas boleh dihias menggunakan penghias yang mengambil hujah tambahan. Walau bagaimanapun, persoalan timbul apabila cuba menghantar atribut contoh sebagai hujah kepada penghias ini.

Pertimbangkan contoh berikut:

<code class="python">class Client(object):
    def __init__(self, url):
        self.url = url

    @check_authorization("some_attr", self.url)
    def get(self):
        do_work()</code>

Niatnya adalah untuk menghantar atribut self.url kepada penghias kebenaran_semak . Walau bagaimanapun, Python menimbulkan ralat yang menunjukkan bahawa diri tidak wujud dalam skop definisi kelas.

Penyelesaian

Untuk menyelesaikan isu ini, seseorang boleh menangguhkan semakan atribut kepada masa jalan dengan memintas hujah kaedah dalam penghias. Argumen pertama kepada fungsi pembalut ialah contoh, membenarkan akses kepada atribut contoh.

<code class="python">def check_authorization(f):
    def wrapper(*args):
        print(args[0].url)
        return f(*args)
    return wrapper

class Client(object):
    def __init__(self, url):
        self.url = url

    @check_authorization
    def get(self):
        print('get')

Client('http://www.google.com').get()
# Output: http://www.google.com
#          get</code>

Pendekatan Alternatif

Sebagai alternatif, seseorang boleh mengakses atribut secara dinamik dengan menghantar nama atribut sebagai rentetan kepada penghias. Ini menghapuskan keperluan untuk mengeraskan nama atribut khusus.

<code class="python">def check_authorization(attribute):
    def _check_authorization(f):
        def wrapper(self, *args):
            print(getattr(self, attribute))
            return f(self, *args)
        return wrapper
    return _check_authorization</code>

Atas ialah kandungan terperinci Bolehkah Atribut Contoh Diluluskan sebagai Argumen kepada Penghias Kaedah Kelas 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