【问题标题】:Changing an attribute of a frozen class in attrs在 attrs 中更改冻结类的属性
【发布时间】:2020-11-10 01:02:36
【问题描述】:
import attr
@attr.s(slots=True, frozen=True)
class C:
    url = attr.ib(type=str)
    x = attr.ib()
    y = attr.ib()
    z = attr.ib(default=10)
    
    @y.default
    def _any_name_except_a_name_of_an_attribute(self):
        return self.x + 1
    
    @url.validator
    def map_url(self, attribute, value):
        if value == "apple":
            self.url = "mango"

print(C(x=4,y=5, url="apple"))

我希望找到一种方法来在初始化为特定值时更改 url,而不会丢失类的冻结属性,这是否可能?

【问题讨论】:

    标签: python python-attrs


    【解决方案1】:

    更改传入的值是 converter 的用途:

    url = attr.ib(type=str, converter=lambda x: 'mango' if x=='apple' else x)
    

    【讨论】:

      【解决方案2】:

      或者,这可以使用attr.evolve 方法在初始化后实现,该方法创建实例的副本并应用指定的更改,从而保持对类实例的冻结约束。

      顺便说一句,这种对不可变实例的修改在函数式编程中随处可见,例如 scala 的案例类copy method

      >>> c = C(x=4, y=5, url="apple")
      
      # create a new instance with a different url
      >>> attr.evolve(c, url="banana")
      C(url='banana', x=4, y=5, z=10)
      
      # original instance remains unchanged
      >>> c
      C(url='apple', x=4, y=5, z=10)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-24
        • 2011-08-01
        • 2018-04-22
        • 2015-12-08
        • 2013-01-21
        • 2023-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多