|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
class Singleton(type):
def __call__(cls, *args, **kwargs):
print(cls, args, kwargs)
if not hasattr(cls, '_instance'):
print('cls in it')
# 问题是这个super(Singleton, cls)到底是什么?为什么没有
# __call__的属性,我调用__call__又可以,实在然人费解
print(dir(super(Singleton, cls)))
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
# cls._instance.__init__(*args, **kwargs)
print('cls is over __init__')
return cls._instance
class Foo(metaclass=Singleton):
def __init__(self, name):
print('Foo__init__')
self.x = 1
self.name = name
print('foo__init__out')
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
f1 = Foo('sidian')
f2 = Foo('wudian')
print(f1 == f2)
print(f1.x)
print(f1.name)
print(f2.name)
输出
<class '__main__.Foo'> ('sidian',) {}
cls in it
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__self_class__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__thisclass__']
Foo__init__
foo__init__out
cls is over __init__
<class '__main__.Foo'> ('wudian',) {}
True
1
sidian
sidian
|
|