최근에 저는 싱글 톤을 구현하기 위해 메타 클래스를 사용했습니다. 그럼,이 __metaclass__
물건이 어떻게 작동하는지 이해하려고했습니다. 나는 그것에 대해 두 가지 질문이은 메타 클래스가 매우 비슷합니다.
import numpy as np
class Meta(type):
_instance = None
def __init__(cls, *args, **kwargs):
print('meta: init')
#return super(Meta, cls).__init__(*args, **kwargs)
def __new__(cls, *args, **kwargs):
print('meta: new')
return super(Meta, cls).__new__(cls, *args, **kwargs)
def __call__(cls, *args, **kwargs):
print('meta: call')
if cls._instance is None:
cls._instance = super(Meta, cls).__call__(*args, **kwargs)
print(cls._instance.__class__)
return cls._instance
class ClassA():
__metaclass__ = Meta
def __init__(self, *args, **kwargs):
self.val = np.random.randint(1000)
print('classA: init')
def __new__(cls, *args, **kwargs):
print('classA: new')
return super(ClassA, cls).__new__(cls, *args, **kwargs)
def __call__(cls, *args, **kwargs):
print('classA: call')
return super(ClassA, cls).__call__(*args, **kwargs)
class ClassB():
__metaclass__ = Meta
def __init__(self, *args, **kwargs):
print('classB: init')
self.val = np.random.randint(1000)
def __new__(cls, *args, **kwargs):
print('classB: new')
return super(ClassB, cls).__new__(cls, *args, **kwargs)
def __call__(cls, *args, **kwargs):
print('classB: call')
return super(ClassB, cls).__call__(*args, **kwargs)
class ClassC(ClassB):
def __init__(self, *args, **kwargs):
print('classC: init')
super(ClassC, self).__init__(self, *args, **kwargs)
self.test = 3
def __new__(cls, *args, **kwargs):
print('classC: new')
return super(ClassC, cls).__new__(cls, *args, **kwargs)
def __call__(cls, *args, **kwargs):
print('classC: call')
return super(ClassC, cls).__call__(*args, **kwargs)
if __name__ == '__main__':
a1 = ClassA()
b1 = ClassB()
a2 = ClassA()
b2 = ClassB()
c1 = ClassC()
print(a1.val)
print(b1.val)
print(a2.val)
print(b2.val)
: 이렇게하려면, 나는이 코드 조각을 썼다
이유는 무엇입니까
cls._instance
이__main__.ClassA object
(또는__main__.ClassA object
)?super
으로 생성되었으므로 상위 인스턴스가 아니어야합니까?ClassC
예를하지만를 만들 때 왜ClassC
내부에 아무것도 (도__call__
도__init__
)가 호출되지 경우에만ClassB.__call__
(그것에서 상속으로)?
'__super__'란 무엇입니까? 파이썬에는 특별한 방법이나 속성이 없습니다. 당신은'super()'객체에 대해 이야기하고 있습니까? –
Python 2.x 또는 3.x를 사용하고 있습니까? –