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())
所以有 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())