Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Mensimulasikan Pembolehubah Fungsi Statik dalam Python?

Bagaimanakah Saya Boleh Mensimulasikan Pembolehubah Fungsi Statik dalam Python?

Susan Sarandon
Susan Sarandonasal
2024-12-04 17:56:11165semak imbas

How Can I Simulate Static Function Variables in Python?

Pembolehubah Fungsi Statik Bersamaan Python

Masalah:
Bagaimanakah Python melaksanakan pembolehubah statik dalam fungsi, serupa dengan C/C ' s pembolehubah ahli statik ditakrifkan pada fungsi tahap?

Jawapan:

Dalam Python, tiada persamaan langsung untuk pembolehubah statik dalam fungsi. Walau bagaimanapun, kefungsian yang serupa boleh dicapai menggunakan gabungan fungsi bersarang dan penutupan:

def foo():
    def counter():
        if not hasattr(foo, "counter_value"):
            foo.counter_value = 0
        foo.counter_value += 1
        return foo.counter_value
    return counter

Di sini, fungsi foo() mentakrifkan pembilang fungsi bersarang(). Fungsi luar foo() berfungsi sebagai penutup untuk kaunter(), menyediakannya dengan ruang nama terpencil.

Untuk mengakses dan menambah kaunter, anda akan menghubungi:

counter = foo()
counter()  # Initializes the counter
counter()  # Increments the counter

Pendekatan Penghias:

Pendekatan lain ialah menggunakan penghias untuk mencipta statik pembolehubah:

def static_vars(**kwargs):
    def decorate(func):
        for k in kwargs:
            setattr(func, k, kwargs[k])
        return func
    return decorate

@static_vars(counter=0)
def foo():
    foo.counter += 1
    return foo.counter

Sintaks ini membolehkan anda memulakan dan mengakses pembolehubah statik dengan lebih mudah, tetapi ia memerlukan penggunaan foo. awalan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mensimulasikan Pembolehubah Fungsi Statik 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