直接属性访问是否比定义的API更“pythonic”

时间:2012-09-05 21:16:41

标签: python

还有什么“Pythonic”?

user.fullname = fullname
user.gender= gender
user.description = description

VS

user.update_profile(fullname, gender, description)

显然,后者在大多数情况下(和我的偏好)只是前者的包装,但是我在网上看到关于如何直接访问(使用属性装饰器)更加pythonic的所有话题,我只是好奇。

2 个答案:

答案 0 :(得分:2)

它们或多或少都不是pythonic;他们有不同的用例。

如果希望能够逐个更新属性,请使用前者。在需要时用属性替换它。但是,在设置属性时,请使用显式方法,使其具有超出验证的副作用。

必须一次更新所有三个属性时使用后者,例如当你需要对值组合进行健全性检查时。没有特殊的语法可以合理地取代这个习语。

答案 1 :(得分:2)

这取决于你打算如何使用这个类 - 我经常发现在实现它之前编写代码的理论用法很有用。例如,您可能会像这样使用User类:

user = User(fullname='Sally McExample', gender='F', description='...')
user.save()

# Later:
user = User.find(...)
user.fullname = 'Sally McChanged'
user.save()

鉴于您提出的update_profile示例,相同的代码将是乏味的:

user = User.find(...)
user.update_profile('Sally McChanged', user.gender, user.description)
user.save()

请注意,如果您需要对数据进行更详细的处理而不是赋值(如值验证或文本清理),您可以将属性转换为property ...但是如果您预见到需要这样的行为从一开始,然后update_profile - 类型方法使其更清晰,而不是分配可能发生