setattr调用属性设置器功能吗?

问题描述

我尝试在代码中加入良好的oop行为,并想知道以下内容

我通常有这样的课程设计:

class MyClass():
    def __init__(self,arg1):
        self.arg1 = arg1

    @property
    def arg1(self):
        return _arg1

    @arg1.setter
    def arg1(self,value):
        self._arg1 = value

如果我现在编写一个具有dict并将其用于设置类属性函数

    def set_my_dict(self):
        argdict = {'arg1':4}
        for k,v in argdict:
            setattr(self,k,v)

在这种情况下,此setattr调用是否进行了可能进行类型检查的设置程序等?

解决方法

我也很感兴趣,所以我打开了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

在实例化和使用setattr时都使用setter函数。整洁。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...