代码之家  ›  专栏  ›  技术社区  ›  Basj

删除类属性并将其替换为普通变量

  •  0
  • Basj  · 技术社区  · 5 年前

    假设我们有这个属性:

    import time
    
    class Test:
        @property
        def dt(self):
            return time.time()
    
    t = Test()
    print(t.dt)  # 1590402868.9415174
    

    在这个类的某些实例中,我想重写这个 property

    t.dt = 1234
    

    不起作用: AttributeError: can't set attribute

    我也试过用二传手:

    @dt.setter
    def dt(self, value):
        self.dt = value        
    

    但是: RecursionError: maximum recursion depth exceeded

    所有物 对于对象实例,是否将其替换为普通变量/属性?

    0 回复  |  直到 5 年前
        1
  •  1
  •   zanuda    5 年前

    如果我理解正确,类似这样的东西可以帮助您:

    class Test: 
        def __init__(self): 
            self._dt = None
    
        @property
        def dt(self):
            return self._dt if self._dt is not None else time.time()
    
        @dt.setter
        def dt(self, value):
            self._dt = value
    
        @dt.deleter
        def dt(self):
            self._dt = None
    
    t = Test()
    print(t.dt) #1590405187.1155756
    
    t.dt = 1234 
    print(t.dt) #1234
    

    或者,您可以从类本身中删除该属性:

    t = Test()
    delattr(t.__class__, 'dt')
    
    t.dt = 1234
    print(t.dt) #1234
    

    在这种情况下,您不能更改原始代码。