첫 번째 데모 :__getattr__ 및 __getattribute__에 대한 몇 가지 질문이 있습니까?
class B:
def __init__(self):
self.name = '234'
# def __getattribute__(self, name):
# print('getattr')
def __getattr__(self, name):
print('get')
def __setattr__(self, name, value):
print('set')
def __delattr__(self, name):
print('del')
b = B()
print(b.__dict__)
b.name
b.__dict__
이 {}
이지만, 두 번째 데모 :
class B:
def __init__(self):
self.name = '234'
def __getattribute__(self, name):
print('getattr')
def __getattr__(self, name):
print('get')
def __setattr__(self, name, value):
print('set')
def __delattr__(self, name):
print('del')
b = B()
print(b.__dict__)
b.name
b.__dict__
, 왜 None
입니까? 그리고 b.__dict__
은 __getattribute__
을 호출하지만 __getattr__
을 호출하지 않습니다. __getattribute__
은 __getattr__
을 호출하지 못하게합니까?
'b.name'도'__getattr__'을 호출하지 않지만'b'는 속성'name'을 가지고 있지 않으므로'__getattr__'을 호출하지 마십시오. – gaussclb
@gaussclb :'b.name' ** **'__getattribute__'를 호출합니다; 'get'이 인쇄됩니다. –
'getattr'을'get'하지 않고 출력합니다,'__getattr__'을 호출하지 않으시겠습니까? – gaussclb