Có cách nào đơn giản và gọn gàng để định nghĩa các singleton không?

{{FormatNumbertoThousand(model.total_like)}} lượt thích
61 lượt xem
Python master

Sử dụng một metaclass:

class Singleton(type):
   _instances = {}
   def __call__(cls, *args, **kwargs):
      if cls not in cls._instances:
         cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
      return cls._instances[cls]

#Python2
class MyClass(BaseClass):
   __metaclass__ = Singleton

#Python3
class MyClass(BaseClass, metaclass=Singleton):
   pass

Nói chung, sẽ hợp lý khi sử dụng một metaclass để triển khai một singleton. Một singleton đặc biệt vì chỉ được tạo một lần và metaclass là cách bạn tùy chỉnh việc tạo một lớp. Sử dụng metaclass cho phép bạn kiểm soát nhiều hơn trong trường hợp bạn cần tùy chỉnh các định nghĩa lớp singleton theo những cách khác.

Một cách tiếp cận khác là sử dụng Module:

class Foo(object):
   pass

some_global_variable = Foo()

Các module chỉ được import một lần, mọi thứ khác đều suy nghĩ quá mức.

Đừng sử dụng các singleton và cố gắng không sử dụng các global.

{{login.error}}