还有什么“Pythonic”?
user.fullname = fullname
user.gender= gender
user.description = description
对比
user.update_profile(fullname, gender, description)
显然,后者在大多数情况下只是前者的包装器(也是我的偏好),但是我在网上看到的所有关于直接访问(使用属性装饰器)如何更像 Python 的讨论,我只是好奇。
还有什么“Pythonic”?
user.fullname = fullname
user.gender= gender
user.description = description
对比
user.update_profile(fullname, gender, description)
显然,后者在大多数情况下只是前者的包装器(也是我的偏好),但是我在网上看到的所有关于直接访问(使用属性装饰器)如何更像 Python 的讨论,我只是好奇。
两者都不像另一个或多或少是pythonic。他们有不同的用例。
当您希望能够逐个更新属性时,请使用前者。需要时将其替换为属性。但是,当设置属性具有超出验证的副作用时,请务必使用显式方法。
当您必须同时更新所有三个属性时使用后者,例如当您需要对值的组合进行完整性检查时。没有特殊的语法可以合理地替换这个习语。
这取决于您打算如何使用该类 - 我经常发现在实现代码之前编写代码的理论用法很有用。例如,您可能会像这样使用 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
-type 方法比分配可能发生的更清楚