Bagaimana saya meneruskan bidang kelas ke dekorator pada metode kelas sebagai argumen? Yang ingin saya lakukan adalah sesuatu seperti:
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization("some_attr", self.url)
def get(self):
do_work()
Mengeluh bahwa diri tidak ada untuk lewat self.url
ke dekorator. Apakah ada jalan keluarnya?
python
python-decorators
Menandai
sumber
sumber
Jawaban:
Iya. Alih-alih meneruskan atribut instance pada waktu definisi kelas, periksa saat runtime:
Dekorator memotong argumen metode; argumen pertama adalah instance, jadi ia membaca atributnya. Anda bisa memasukkan nama atribut sebagai string ke dekorator dan menggunakan
getattr
jika Anda tidak ingin membuat kode nama atribut:sumber
sumber
Contoh yang lebih ringkas adalah sebagai berikut:
Yang akan dicetak:
sumber
Pilihan lain adalah meninggalkan gula sintaksis dan menghias di
__init__
kelas.yang akan dicetak
sumber
Kamu tidak bisa Tidak ada
self
dalam tubuh kelas, karena tidak ada contoh ada. Anda harus meneruskannya, misalnya, yangstr
berisi nama atribut untuk mencari pada instance, yang kemudian dapat dilakukan fungsi yang dikembalikan, atau menggunakan metode yang berbeda sama sekali.sumber