设置对象实例变量的正确方法

ens*_*are 16 python oop pylons

我正在编写一个类来将用户插入到数据库中,在我走得太远之前,我只想确保我的OO方法是干净的:

class User(object):

    def setName(self,name):

        #Do sanity checks on name
        self._name = name

    def setPassword(self,password):

        #Check password length > 6 characters
        #Encrypt to md5
        self._password = password

    def commit(self):

        #Commit to database

>>u = User()
>>u.setName('Jason Martinez')
>>u.setPassword('linebreak')
>>u.commit()
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?我应该声明类变量吗?我应该在所有类变量前面使用_来使它们变为私有吗?

谢谢你的帮助.

bch*_*rry 21

它通常是正确的,AFAIK,但你可以用属性清理它.

class User(object):

    def _setName(self, name=None):
        self._name = name

    def _getName(self):
        return self._name

    def _setPassword(self, password):
        self._password = password

    def _getPassword(self):
        return self._password

    def commit(self):
        pass

    name = property(_getName, _setName)
    password = property(_getPassword, _setPassword)

>>u = User()
>>u.name = 'Jason Martinez'
>>u.password = 'linebreak'
>>u.commit()
Run Code Online (Sandbox Code Playgroud)

还有一个方便的基于装饰器的语法,文档也解释了这一点.


gur*_*lex 7

使用单个_不会使您的属性变为私有:它是一种约定,它告诉它是一个内部属性,在正常情况下不应该被外部代码访问.使用您的代码,它还意味着密码和名称是只读的.

我强烈建议你为你的类使用一个初始化器,它会初始化你的属性,即使是一个默认值,例如None:它会使你在提交方法中更容易,你不必检查是否存在_name和_password属性(使用hasattr).

在代码上使用Pylint.