Is type(name, bases, dict) 可用于创建实例(class 的对象),例如在 Singleton 中

Is type(name, bases, dict) could be used to create instance(object of class), for example inside Singleton

所以有 object.__new__(cls)super().__new__(cls) 函数可以用来创建实例,但是我可以使用 type(name, bases, dict)(*args, **kwargs) 来创建实例吗?

class Singleton(object):

  instance = None

  def __init__(self, *args, **kwargs):
    pass

  def __new__(cls, *args, **kwargs):
    if isinstance(cls.instance, type(None)):
      mcls = cls.__class__
      cls.instance = type(mcls.__name__, mcls.__bases__, dict(cls.__dict__))(*args, *kwargs)

    return cls.instance

s = Singleton()
print(s)

所以我找不到在 cls.__dict__ 中保留 __new__ 方法的方法,它会导致追溯,所以我在 class 创建之前将其删除。

class FooMixin(object):
  def print_somth(self):
    print('smth....')


class Singleton(FooMixin):

  instance = None

  def __new__(cls, *args, **kwargs):
    if cls.instance is None:
      temp = dict(cls.__dict__)
      del temp['__new__']
      temp['test'] = 100
      cls.instance = type('Singleton', cls.__bases__, temp)(*args, **kwargs)
    return cls.instance

s = Singleton()
print(s.test, s.print_somth())