__getattr__和__setattr__在这段代码中的作用是什么?
what is the role of __getattr__ and __setattr__ in this piece of code?
我用这种方式在 python 中编写了单例模式。它工作正常,但我不明白 getattr 和 setattr到底是做什么的? getattr() 和 getattr 之间以及 python 中的 setattr() 和 setattr 之间有什么区别?这两种方法(getattr 和 setattr)对内部 class 做了什么以及这两种方法如何区分在内部 class 而不是外部 class ?
提前谢谢你。
class Writer:
class __file_writer:
def __init__(self):
self.variable = None
def __str__(self):
return str(id(self))
instance = None
def __new__(cls, *args, **kwargs):
if not Writer.instance :
Writer.instance = Writer.__file_writer()
return Writer.instance
def __getattr__(self, item):
return getattr(self.instance,item)
def __setattr__(self, key, value):
return setattr(self.instance, key,value)
if __name__ == '__main__':
obj1=Writer()
obj1.name = 'moli'
print(obj1.name)
print(type(obj1))
obj2 = Writer()
obj2.name = 'ffff'
print(obj2.name)
print(obj1.name)
print(obj1)
print(obj2)
__getattr__ 在您要查找此 class.
中不存在的属性时起作用
和 __setattr__ 当您为 class 中不存在的属性赋值时
检查这两个例子
https://python-reference.readthedocs.io/en/latest/docs/dunderattr/setattr.html#example
https://python-reference.readthedocs.io/en/latest/docs/dunderattr/getattr.html#example
它在这里没有任何作用。因为当您访问 name
时,您访问的是 class __file_writer
的 name
属性,而不是 class Writer
.
的属性
如果您将 __getattr__
函数推送到 __file_writer
class 那么当您尝试访问属性 name
.
我用这种方式在 python 中编写了单例模式。它工作正常,但我不明白 getattr 和 setattr到底是做什么的? getattr() 和 getattr 之间以及 python 中的 setattr() 和 setattr 之间有什么区别?这两种方法(getattr 和 setattr)对内部 class 做了什么以及这两种方法如何区分在内部 class 而不是外部 class ? 提前谢谢你。
class Writer:
class __file_writer:
def __init__(self):
self.variable = None
def __str__(self):
return str(id(self))
instance = None
def __new__(cls, *args, **kwargs):
if not Writer.instance :
Writer.instance = Writer.__file_writer()
return Writer.instance
def __getattr__(self, item):
return getattr(self.instance,item)
def __setattr__(self, key, value):
return setattr(self.instance, key,value)
if __name__ == '__main__':
obj1=Writer()
obj1.name = 'moli'
print(obj1.name)
print(type(obj1))
obj2 = Writer()
obj2.name = 'ffff'
print(obj2.name)
print(obj1.name)
print(obj1)
print(obj2)
__getattr__ 在您要查找此 class.
中不存在的属性时起作用和 __setattr__ 当您为 class 中不存在的属性赋值时 检查这两个例子
https://python-reference.readthedocs.io/en/latest/docs/dunderattr/setattr.html#example
https://python-reference.readthedocs.io/en/latest/docs/dunderattr/getattr.html#example
它在这里没有任何作用。因为当您访问 name
时,您访问的是 class __file_writer
的 name
属性,而不是 class Writer
.
如果您将 __getattr__
函数推送到 __file_writer
class 那么当您尝试访问属性 name
.