【问题标题】:attribute and private attribute difference in Python property?Python属性中的属性和私有属性的区别?
【发布时间】:2021-02-20 02:31:13
【问题描述】:
class test:              #1
 def __init__(self):     #2
    self.abc = 123       #3
 @property               #4
 def abc(self):          #5
    return self._abc     #6

 @abc.setter             #7
 def abc(self, value):   #8
    self._abc = value    #9

 @abc.deleter            #10
 def abc(self):          #11
    del self._abc        #12

obj = test()             #13
obj.abc = 456            #14
print(obj.abc)           #15

class test:              #1
 def __init__(self):     #2
    self._abc = 123      #3
 @property               #4
 def abc(self):          #5
    return self._abc     #6

 @abc.setter             #7
 def abc(self, value):   #8
    self._abc = value    #9

 @abc.deleter            #10
 def abc(self):          #11
    del self._abc        #12

obj = test()             #13
obj.abc = 456            #14
print(obj.abc)           #15

init方法中的self._abc和self.abc有什么区别?

这两个程序的输出可能相同,但代码行为不同。

第一个程序运行:13-2-3-7-9-3-14-7-9-15-4-6

第二个程序运行:13-2-3-14-7-9-15-4-6

为什么?

【问题讨论】:

    标签: python properties


    【解决方案1】:

    不是最有经验的编码员,但据我所知,Python 没有明确具有公共或私有属性,所有类变量/方法都可以随时访问。

    self._abc 中的下划线更像是“开发人员的不成文规则”,下划线用于使属性“私有”——技术上不是,但其他开发人员会看到它并将其视为私有。其他 self.abc() 函数是该“私有”变量的公共 getter/setter/deleter。

    同样,这不是由 Python 定义的,因此有人可以轻松地调用 self._abc 并对其进行修改,它会编译并运行 - 但这样做是不好的做法。

    【讨论】:

    • 我的错。我不想清楚地描述我的问题。我编辑了它。
    • 不用担心。对于您更新的问题:在您的测试类中,有一个私有变量 _abc(带下划线),并且 abc() 充当私有变量 _abc 的 getter/setter 函数。在第一个程序中,init 函数通过公共 setter 函数 abc 修改 _abc,因此 init -> setter abc() -> self._abc。第二个程序中,init函数绕过setter函数abc,直接修改_abc,所以init -> self._abc。试试这个类比 - 使用开始 -> 关机关闭您的电脑,或按下电源按钮。一种方法使用预定义的按钮单击,另一种方法绕过。
    猜你喜欢
    • 2014-06-19
    • 2011-11-14
    • 2010-09-29
    • 2016-04-29
    相关资源
    最近更新 更多