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

时间:2010-03-26 07:52:33

标签: 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()

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

感谢您提供帮助。

4 个答案:

答案 0 :(得分:21)

答案 1 :(得分:7)

答案 2 :(得分:3)

该代码中没有类变量,只有实例属性。并使用properties而不是访问者。并在初始值设定项中创建实例属性,最好是传入的值:

class User(object):
  def __init__(self, name, password='!!'):
    self.name = name
    self.password = password

  ...

答案 3 :(得分:2)

其他人已经指出:如果在获取/设置属性时不需要执行其他逻辑,请避免使用setter和getter并使用简单的属性访问。 如果确实需要额外的逻辑,那么使用属性。

如果要将许多参数传递给实例初始值设定项,请考虑使用包含所有参数的单独对象或字典:

>>> class User(object):
...     def __init__(self, params):
...         self.__dict__.update(params)
... 

>>> params = {
...     'username': 'john',
...     'password': 'linebreak',
...     }
>>> user = User(params)
>>> user.username
'john'
>>> user.password
'linebreak'

P.S。在您的情况下,您不需要在类级别声明属性。 如果你想在所有类实例中共享相同的值,通常会这样做:

>>> class User(object):
...     type = 'superuser'
... 
>>> user = User()
>>> user2 = User()
>>> 
>>> user.type
'superuser'
>>> user2.type
'superuser'
>>> 
>>> user2.type = 'instance superuser'
>>> 
>>> user.type
'superuser'
>>> user2.type
'instance superuser'
>>> User.type
'superuser'