gpt4 book ai didi

python - User 类应该是不可变的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 10:47:51 24 4
gpt4 key购买 nike

我正在读一本关于 OOP 的书:Elegant Objects通过 @yegor256 .它说:“始终使用不可变对象(immutable对象)”(代码将更易于维护)。

所以,如果我有 User 类并且我想更改地址,我应该返回一个新用户 (change_address_option2) 吗?直到这一刻,我通常会执行 change_address_option1

class User:
def __init__(self, name, address):
self.name = name
self.address = address

def change_address_option1(self, new_address):
self.address = new_address

def change_address_option2(self, new_address):
return User(self.name, new_address)

这真的是一个好习惯吗?我在其他项目中没有看到这一点:

if __name__== "__main__":
john = User("John", "California")

# Option 1
john.change_address_option1("New York")
# continue working with john

# Option 2
john_in_new_york = john.change_address_option2("New York")
# continue working with john_in_new_york

编辑:阅读@ShadowRanger 的评论后,我将问题编辑得更具体。谢谢。

最佳答案

您正在阅读的这本书似乎在鼓励函数式编程风格。虽然函数式编程通常会避开可变对象,但在像您这样的情况下,我认为这不是 Python 中常用或认可的策略。

特别是,这种策略只在函数式语言中相对便宜(Python 支持函数式编程风格,但它是一种不需要函数式编码的多范式语言),语言本身通常可以识别这样的模式并实现它在不改变观察到的行为的情况下作为突变,以最小化这样做的开销。 Python 对此提供支持,因此这样做的成本相当高。

对于类似由数据库表支持的模型,只需使用可变对象。有不可变对象(immutable对象)的用例,但至少在惯用的 Python 中,它们通常仅限于根本不会进行更改的情况,或者如果进行了更改,它们会生成完全不相关的对象。在这种情况下,它总是同一个“John”,并且生成新对象而不是就地改变它们会带来数据不同步的重大风险,引用存储在某些地方的旧对象和新对象object in others,没有明显的方法来确定哪个是新的。对于唯一用户的当前状态,拥有一个单一的可变黄金标准是值得使用可变对象的。

关于python - User 类应该是不可变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57931864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com