Discuss / Python / 参数定义需注意!!!变量前要有下划线

参数定义需注意!!!变量前要有下划线

Topic source
class Screen(object):
    @property
    def width(self):
        return self._width
    @width.setter
    def width(self,value):
        self._width = value
    @property
    def height(self):
        return self._height
    @height.setter
    def height(self,value):
        self._height = value
    @property
    def resolution(self):
        return self._width * self._height

为什么要加上下划线?

Mr_安生

#3 Created at ... [Delete] [Delete and Lock User]

因为是使用@property装饰器的时候: 本来是外部函数的def set_width(self),为了符合题意,即,将width绑定给实例s,将来可以这样用s.width 所以,在装饰器内,def width必然得这么写,不然就实现不了s.width的用法了。 所以,在装饰器内部函数的变量写法上,必须得和def width中的函数名width有所区分,写成:self._width。 否则,如果写成self.width就乱套了。

Mr_安生

#4 Created at ... [Delete] [Delete and Lock User]

再仔细观察廖老大本篇文章的上半部分,也就是没讲@property之前的代码,其实是为了 讲@property做铺垫的,所以里面都加了小横线,但是,如果不用@property,其实那里的部分的小横线是可以省略的。

夏夏夏SR

#5 Created at ... [Delete] [Delete and Lock User]

必须用下划线吗?不能用别的吗。。。我以为这里只是为了区别width和height,

Mr_安生

#6 Created at ... [Delete] [Delete and Lock User]

可以用别的啊,不一定必须只用加个小下划线啊,只不过之前讲过加一个下划线,同时意味着:“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。我觉得是 代码严谨性问题吧

WALL_E91

#7 Created at ... [Delete] [Delete and Lock User]

mark一下,安生解释的真好~

WALL_E91

#8 Created at ... [Delete] [Delete and Lock User]

我觉得在这里下划线仅仅是为了区别。我试过了,有装饰器的时候,self后面的变量名,只要不和def后面的冲突就好。所以,我觉得def后面所跟着的变量是为了给子类的变量,而self后面的变量则是装饰器内部所需要的变量,只是在装饰器内部计算时需要的变量。这两个似乎完全不冲突。不知道对不对。。。


  • 1

Reply