Dekorator Benang [Python]

Oct 27 2020

Saya mencoba membuat program sederhana menggunakan soket python dan perpustakaan threading. Saya ingin mengotomatiskan prosedur berikut menggunakan dekorator:

t = threading.Thread(target=function, args=(arg1, arg2))
t.start()

program ini disusun menggunakan OOP jadi saya mendefinisikan subclass di dalam yang utama untuk menampung semua dekorator (saya telah membaca tentang metode ini di artikel ini: https://medium.com/@vadimpushtaev/decorator-inside-python-class-1e74d23107f6). Oleh karena itu saya mengalami situasi seperti ini:

class Server(object):

    class Decorators(object):

        @classmethod
        def threaded_decorator(cls, function):
            def inner_function():
                function_thread = threading.Thread(target=function)
                function_thread.start()
            return inner_function

    def __init__(self, other_arguments):
        # other code
        pass

    @Decorators.threaded_decorator
    def function_to_be_threaded(self):
        # other code
        pass

Tapi ketika saya mencoba untuk menjalankan, saya mendapatkan error berikut: TypeError: function_to_be_threaded() missing one required argument: 'self'. Saya menduga bahwa masalahnya terletak di bagian ketika saya memanggil threading.Thread (target = function) yang entah bagaimana tidak melewatkan seluruh fungsi self.function_to_be_threaded. Karenanya, jika Anda tahu cara memperbaikinya, bisakah Anda memberi tahu saya ?. Selain itu, dapatkah Anda memberi tahu saya jika ada cara untuk menerapkan dekorator yang menerima argumen yang akan diteruskan ke kelas Thread sebagai args=(arguments_of_the_decorator)?

Terima kasih banyak atas waktunya dan maafkan bahasa Inggris saya, saya masih berlatih

Jawaban

1 napuzba Oct 27 2020 at 15:15

Gunakan *argssintaks untuk memindahkan argumen. Dengan kata lain, gunakan *argsuntuk mengumpulkan semua argumen posisi sebagai tupel dan memindahkannya threading.Threadsebagai args.

import threading
import time
class Server(object):

    class Decorators(object):

        @classmethod
        def threaded_decorator(cls, function):
            def inner_function(*args):
                function_thread = threading.Thread(target=function,args=args)
                function_thread.start()
            return inner_function

    def __init__(self, count,sleep):
        self.count = count
        self.sleep = sleep

    @Decorators.threaded_decorator
    def function_to_be_threaded(self,id):
        for xx in range(self.count):
            time.sleep(self.sleep)
            print("{} ==> {}".format(id,xx))
           

>>> Server(6,1).function_to_be_threaded('a')
>>> Server(2,3).function_to_be_threaded('b')

a ==> 0
a ==> 1
a ==> 2
b ==> 0
a ==> 3
a ==> 4
a ==> 5
b ==> 1

lihat juga Bagaimana cara menyampaikan argumen dari satu fungsi ke fungsi lainnya?