在一个类的方法中改变其属性是一种不好的做法吗?

3

嘿,我是一个初学者,希望得到一些建议。

class Board():

    def __init__(self):
        self.x = 0
        self.y = 0
    
    def SelectSquare(self,direction):
        #based on some value from direction
        self.x += 1
        #or
        self.y += 1

        #return square at self.x and self.y

考虑到以上代码,像这样在对象内部创建会发生变化的属性是否是不良实践?

8
不,那正是它们的作用。使用类的主要原因之一是为了维护内部状态。 - undefined
5
一个方法改变实例的状态并不是一个坏习惯,但通常一个方法要么改变实例的状态要么返回某些值。 - undefined
这是一个有争议的问题,确实有一些学派认为你应该永远不要改变任何东西。但在面向对象编程中,方法改变对象是常规做法。 - undefined
不,这是正确的做法——它被称为封装,是面向对象编程的基本组成部分。 - undefined
2个回答

4

这完全没问题。它符合面向对象编程的范式,即 (维基百科):

对象的一个特点是其自身程序可以访问并经常修改自己的数据字段。

只有两点需要注意:

  • 对于方法名称,请使用蛇形命名法而不是帕斯卡式命名法。

  • 如果一个方法会更改属性,则最好不要让它返回任何东西。当程序员在调用此方法时意识到将返回值与另一个副作用同时出现时,他们可能会感到惊讶。

    决定函数是否应该 返回 某些东西 -- 在这种情况下,最好不要更改实例 -- 或者 返回任何东西,在这种情况下,完全可以更改实例。当然,也有例外。重要的是,调用者不应该被“副作用”所惊讶。


2
在编写方法名时,请使用camelCase,而不是PascalCase。在Python中,我们使用snake_case,而不是上述两种命名方式。 - undefined
这里有多种习惯,但大多数人都认为 PascalCase 应该保留给类名使用。 - undefined
1
没错,但是在PEP8中明确规定要使用蛇形命名法。 - undefined
1
好的,我会适应。 - undefined
@juanpa.arrivillaga 谢谢,我正要提到这个:https://www.python.org/dev/peps/pep-0008/ 还有,非常棒的回答 @trincot! - undefined
显示剩余2条评论

2

这不是一种不好的做法。如果你的逻辑需要改变一个对象的属性,那么有一个处理该操作的方法是非常合理的,而不是在一个无关的代码片段中执行它,从而违反封装原则。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接