Удалите свойство класса и замените его нормальной переменной - PullRequest
0 голосов
/ 25 мая 2020

Допустим, у нас есть это свойство:

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.

Вопрос: как переопределить / удалить property для экземпляра объекта и заменить его обычной переменной / атрибутом?

1 Ответ

1 голос
/ 25 мая 2020

Если я вас правильно понял, вам может помочь что-то вроде этого:

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

В этом случае вы не может изменить исходный код.

...