Một cách tiếp cận hướng đối tượng và thực hiện chức năng của mình một lớp học, hay còn gọi là "functor", có trường hợp tự động theo dõi xem liệu chúng có được chạy hay không khi mỗi cá thể được tạo ra.
Vì câu hỏi được cập nhật của bạn cho biết bạn có thể cần nhiều người trong số họ, tôi đã cập nhật câu trả lời của mình để giải quyết vấn đề đó bằng cách sử dụng mẫu class factory. Đây là một chút bất thường, và iy có thể đã bị bỏ phiếu vì lý do đó (mặc dù chúng tôi sẽ không bao giờ biết chắc chắn vì họ không bao giờ để lại một bình luận). Nó cũng có thể được thực hiện với một metaclass, nhưng nó không đơn giản hơn nhiều.
def RunOnceFactory():
class RunOnceBase(object): # abstract base class
_shared_state = {} # shared state of all instances (borg pattern)
has_run = False
def __init__(self, *args, **kwargs):
self.__dict__ = self._shared_state
if not self.has_run:
self.stuff_done_once(*args, **kwargs)
self.has_run = True
return RunOnceBase
if __name__ == '__main__':
class MyFunction1(RunOnceFactory()):
def stuff_done_once(self, *args, **kwargs):
print("MyFunction1.stuff_done_once() called")
class MyFunction2(RunOnceFactory()):
def stuff_done_once(self, *args, **kwargs):
print("MyFunction2.stuff_done_once() called")
for _ in range(10):
MyFunction1() # will only call its stuff_done_once() method once
MyFunction2() # ditto
Output:
MyFunction1.stuff_done_once() called
MyFunction2.stuff_done_once() called
Lưu ý: Bạn có thể làm cho một hàm/lớp có khả năng làm công cụ một lần nữa bằng cách thêm một phương pháp reset()
để lớp con của nó mà reset chia sẻ has_run
thuộc tính. Cũng có thể chuyển đối số thông thường và từ khóa sang phương thức stuff_done_once()
khi hàm functor được tạo và phương thức được gọi, nếu muốn.
Và, có, nó sẽ được áp dụng cho thông tin bạn đã thêm vào câu hỏi của mình.
Nếu bạn phải chạy một lần, tại sao bạn không chỉ gọi hàm -> myFunction() một lần !!. Vui lòng xem mã của bạn, giải thích mục đích tốt hơn.! – pyfunc
Tại sao bạn không thể rời khỏi vòng lặp đó? Thêm bối cảnh xin vui lòng. – EightyEight
@pyfunc Hãy cho tôi biết nếu mã chỉnh sửa rõ ràng hơn chuyển tải vấn đề – Ron