【问题标题】:Is setattr calling property setter func?setattr 调用属性设置器功能吗?
【发布时间】:2021-01-04 10:13:00
【问题描述】:

我试图在我的代码中适应良好的 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 并使用这个 dict 来设置类属性:

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

在这种情况下,setattr 是否会调用 setter 进行可能的类型检查等?

【问题讨论】:

  • 是的,setattr(self, "k", v) 旨在与 self.k = v 具有相同的语义。

标签: python oop properties setattr


【解决方案1】:

我也很感兴趣,所以我打开了ipython,在setter方法中添加了pdb进行测试。

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 时都使用。整洁。

【讨论】:

    猜你喜欢
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多