setattr 调用 属性 setter func 吗?
Is setattr calling property setter func?
我尝试在我的代码中加入良好的 oop 行为并且想知道以下问题:
我一般有这样一个class设计:
class MyClass():
def __init__(self,arg1):
self.arg1 = arg1
@property
def arg1(self):
return _arg1
@arg1.setter
def arg1(self, value):
self._arg1 = value
如果我现在写一个函数,它有一个字典,并使用这个字典来设置 class 属性:
def set_my_dict(self):
argdict = {'arg1':4}
for k, v in argdict:
setattr(self, k, v)
在这种情况下,setattr
是否会调用 setter 进行可能的类型检查等?
我也很感兴趣,所以我打开 ipython 并将 pdb 添加到 setter 方法中进行测试。
In [5]: class MyClass():
...: def __init__(self,arg1):
...: self.arg1 = arg1
...:
...: @property
...: def arg1(self):
...: return _arg1
...:
...: @arg1.setter
...: def arg1(self, value):
...: import pdb;
...: pdb.set_trace();
...: self._arg1 = value
...:
In [6]: xr = MyClass(2)
> <ipython-input-5-21bab018f5a2>(13)arg1()
-> self._arg1 = value
(Pdb) c
In [7]: setattr(xr, "arg1", 3)
> <ipython-input-5-21bab018f5a2>(13)arg1()
-> self._arg1 = value
(Pdb) c
setter 函数在实例化和使用 setattr 时都会用到。整齐。
我尝试在我的代码中加入良好的 oop 行为并且想知道以下问题:
我一般有这样一个class设计:
class MyClass():
def __init__(self,arg1):
self.arg1 = arg1
@property
def arg1(self):
return _arg1
@arg1.setter
def arg1(self, value):
self._arg1 = value
如果我现在写一个函数,它有一个字典,并使用这个字典来设置 class 属性:
def set_my_dict(self):
argdict = {'arg1':4}
for k, v in argdict:
setattr(self, k, v)
在这种情况下,setattr
是否会调用 setter 进行可能的类型检查等?
我也很感兴趣,所以我打开 ipython 并将 pdb 添加到 setter 方法中进行测试。
In [5]: class MyClass():
...: def __init__(self,arg1):
...: self.arg1 = arg1
...:
...: @property
...: def arg1(self):
...: return _arg1
...:
...: @arg1.setter
...: def arg1(self, value):
...: import pdb;
...: pdb.set_trace();
...: self._arg1 = value
...:
In [6]: xr = MyClass(2)
> <ipython-input-5-21bab018f5a2>(13)arg1()
-> self._arg1 = value
(Pdb) c
In [7]: setattr(xr, "arg1", 3)
> <ipython-input-5-21bab018f5a2>(13)arg1()
-> self._arg1 = value
(Pdb) c
setter 函数在实例化和使用 setattr 时都会用到。整齐。