@BaldUser
Инженеришка

Как сделать класс с добавляемыми методами?

Уж простите, лучше сформулировать вопрос я не могу. Не знаю, как называется такой паттерн...
Вот захотел я сделать свой класс, чтобы не засорять код проекта всякими таймдельтами:
from datetime import datetime, timedelta

class DT:
    
    def __init__(self, filetime=None):
        if filetime:
            self.dt = datetime.strptime(str(filetime), '%Y%m%d%H%M')
        else:
            self.dt = datetime.now()

    def __eq__(self, other):
        return self.dt == other.dt

    def plus_5_min(self) -> str:
        self.dt += timedelta(minutes=5)

if __name__ == '__main__':
    a = DT('202204061200')
    b = DT('202204061155')
    b.plus_5_min()
    print(a == b)

    c = DT('202204061155')
    print(a == b.plus_5_min())

и вот какой вывод:
True
Traceback (most recent call last):
  File "E:/Мой диск/Python/dt.py", line 24, in <module>
    print(a == b.plus_5_min())
  File "E:/Мой диск/Python/dt.py", line 12, in __eq__
    return self.dt == other.dt
AttributeError: 'NoneType' object has no attribute 'dt'

Хочу, чтобы можно было выполнять сравнение, как в последней строке - прибавлять 5 минут и сравнивать 2 сущности в одной строке. Но метод plus_5_min() возвращает None, и такой номер не проходит. Как это обойти? Ведь во всяких orm пишут несколько методов друг за другом. Или это можно провернуть только со статическими или классовыми методами?
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 1
seven5674
@seven5674
Старый я уже что бы что-то в себе менять
Смущает меня вот это
def __eq__(self, other):
Если ты пишешь вспомогательный класс для работы с датами то я бы пошел по этому тупи
Например
from datetime import datetime, timedelta

class dt:
    def __init__(self, time=None):
        self.dt = datetime.now()
        if time:
            self.dt = datetime.strptime(str(time), '%Y%m%d%H%M')

    def plus_min(self, min=0):
        self.dt += timedelta(minutes=5)
        return self

    def minus_min(self, min=0):
        self.dt -= timedelta(minutes=5)
        return self    

    def get_time(self):
        return self.dt

    def eq(self, time):
        return self.dt == time

    def set_date(self, dt=datetime.now()):
        self.dt = dt
        return self
    
if __name__ == '__main__':
    a = dt('202204061200')
    print(a.plus_min(5).get_time())
    print(a.minus_min(5).get_time())
    print(a.eq('202204061300'))
    print(a.set_date().eq('202204061300'))

Если же цель написать обертку для существующего класса то я бы разделил и вынес операции в другой класс
class dt:
    def __init__(self, time=None):
        self.dt = datetime.now()
        if time:
            self.dt = datetime.strptime(str(time), '%Y%m%d%H%M')

    def get_dt(self):
        return self.dt

class dt_operation:
    def eq(self, dt1, dt2=datetime.now()):
        return dt1 == dt2

if __name__ == '__main__':
    d1 = dt('202204061300')
    d2 = dt('202204061300')
    
    op = dt_operation()
    print(op.eq(d1.get_dt(), d2.get_dt()))


В ООП (не программирование а проектировании) есть такие штуки как Ассоциация, Агрегация и Композиция
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы