Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 扩展日期类_Python - Fatal编程技术网

Python 扩展日期类

Python 扩展日期类,python,Python,我对用python扩展date类有异议 然而,由于date是静态类,所以我并没有让它按预期的方式工作。我试图根据datetime修改代码,因为这个类是从date扩展而来的。然而,他失败了 问题是: 如何修改代码使其工作方式如下: ed=ExtendDate(2011,1,1,周=3,季度=3) 第三周印刷版 在python静态类中(理论上)如何处理\uuuuu new\uuuu和\uuuu init\uuuuu 如何扩展日期类(一般) 谢谢 class ExtendDate(date):

我对用python扩展
date
类有异议

然而,由于date是静态类,所以我并没有让它按预期的方式工作。我试图根据
datetime
修改代码,因为这个类是从
date
扩展而来的。然而,他失败了

问题是:

  • 如何修改代码使其工作方式如下:
  • ed=ExtendDate(2011,1,1,周=3,季度=3)

    第三周印刷版

  • 在python静态类中(理论上)如何处理
    \uuuuu new\uuuu
    \uuuu init\uuuuu

  • 如何扩展日期类(一般)

  • 谢谢

    class ExtendDate(date):
        """Extend to have week and quarter property"""
    
        #
        # def __init__(self, year, month, day, week=None, quarter=None):
        #     pass
    
        def __init__(self, year, month, day, week=None, quarter=None):
            print 0
            super(ExtendDate, self).__init__(year,month,day)
            print 1
            self._week = week
            self._quarter = quarter
    
    
        @staticmethod
        def __new__(cls, year, month, day, week=None, quarter=None):
            cls._week = 1
            super(ExtendDate, cls).__new__(year, month, day)
    
        def __cmp__(self, other):
            if self.cmp_year(other) in [-1,0,1]:
                return self.cmp_year(other)
    
            if hasattr(self, 'quarter'):
                return self.cmp_quarter(other)
    
            if hasattr(self, 'week'):
                return self.cmp_week(other)
            # TODO: test - what if it's just a normal date object ?
            pass
    
        def cmp_quarter(self, other):
            if self.quarter < other.quarter:
                return -1
            elif self.quarter == other.quarter:
                return 0
            elif self.quarter > other.quarter:
                return 1
    
        def cmp_week(self, other):
            if self.week < other.week:
                return -1
            elif self.week == other.week:
                return 0
            elif self.week > other.week:
                return 1
    
        def cmp_year(self, other):
            if self.year < other.year:
                return -1
            elif self.year == other.year:
                return 0
            elif self.year > other.year:
                return 1
    
        def __repr__(self):
            return 'year:' + str(self.year) + ' ' + \
                  'quarter:' + str(self.quarter) + ' ' + \
                  'month:' + str(self.month) + ' '+ \
                  'week:' + str(self.week) + ' '+ \
                  'day:' + str(self.day) + ' '
    
        week = property(lambda self: 0)
        quarter = property(lambda self: 0)
    
        @week.setter
        def week(self, value):
            self._week = value
    
        @quarter.setter
        def quarter(self, value):
            self._quarter = value
    
    class扩展日期(日期):
    “”“扩展到具有周和季度属性”“”
    #
    #定义初始(自身、年、月、日、周=无,季度=无):
    #通过
    定义初始(自身、年、月、日、周=无,季度=无):
    打印0
    超级(扩展、自我)。\uuuu初始(年、月、日)
    打印1
    自我。_周=周
    自成四分之一
    @静力学方法
    定义新(cls,年,月,日,周=无,季度=无):
    cls._周=1
    超级(扩展数据,cls)。\uu新\uuu(年、月、日)
    定义cmp(自身、其他):
    如果在[-1,0,1]年内完成自校准(其他):
    返回自cmp_年(其他)
    如果hasattr(自我,“四分之一”):
    返回自cmp_季度(其他)
    如果hasattr(自我,“周”):
    返回自cmp_周(其他)
    #TODO:测试-如果它只是一个普通的日期对象呢?
    通过
    def cmp_四分之一(自身、其他):
    如果自季度<其他季度:
    返回-1
    elif self.quarter==其他.quarter:
    返回0
    elif self.quarter>其他季度:
    返回1
    def cmp_周(自身、其他):
    如果self.weekother.week:
    返回1
    def cmp_年度(自身、其他):
    如果自年<其他年:
    返回-1
    elif self.year==其他年份:
    返回0
    elif自我年度>其他年度:
    返回1
    定义报告(自我):
    返回“年:”+str(自年)+”\
    '季度:'+str(自我季度)+''\
    '月:'+str(self.month)+''\
    “周:”+str(self.week)+”\
    “日:”+str(self.day)+”
    周=属性(lambda self:0)
    季度=属性(lambda self:0)
    @周塞特
    def周(自我、价值):
    自我。_周=价值
    @四分之一二传手
    def季度(自身、价值):
    自成四分之一=价值
    
    \uuuu new\uuuu
    不应使用
    @staticmethod
    进行修饰(它隐式地是类方法,不应使用修饰符)。它应该返回创建的实例,其中您的代码正在修改
    cls
    (它不应该这样做),而不返回
    super
    \uuuuu new\uuu
    调用的结果(它应该这样做)。另外,如果您提供的是
    \uuuuuuuuuuuu new\uuuuuuu
    (使类在逻辑上不可变),则不应提供
    \uuuuuuuu init\uuuuuu

    实际上,您想要的代码是:

    class ExtendDate(date):
        """Extend to have week and quarter property"""
        __slots__ = '_week', '_quarter'  # Follow date's lead and limit additional attributes
    
        def __new__(cls, year, month, day, week=None, quarter=None):
            self = super(ExtendDate, cls).__new__(cls, year, month, day)
            self._week = week
            self._quarter = quarter
            return self
    
    大概,您还需要功能性getter,例如

        @property
        def week(self):
            return self._week
    
        # ... etc. ...
    

    正如@ShadowRanger回答的,我修改了一些行以使其工作

    主要的变化是
    \uuuuu new\uuuu(cls,年,月,日)

    from datetime导入日期
    类别扩展日期(日期):
    “”“扩展到具有周和季度属性”“”
    __插槽=每周、季度
    定义新(cls,年,月,日,周=无,季度=无):
    #self=super(扩展数据,cls)。\uuuu新的\uuuuu(年、月、日)
    self=日期。\uuuu新\uuuuu(cls,年,月,日)
    自我。_周=周
    自成四分之一
    回归自我
    定义cmp(自身、其他):
    如果在[-1,0,1]年内完成自校准(其他):
    返回自cmp_年(其他)
    如果hasattr(自我,“四分之一”):
    返回自cmp_季度(其他)
    如果hasattr(自我,“周”):
    返回自cmp_周(其他)
    #TODO:测试-如果它只是一个普通的日期对象呢?
    通过
    def cmp_四分之一(自身、其他):
    如果自季度<其他季度:
    返回-1
    elif self.quarter==其他.quarter:
    返回0
    elif self.quarter>其他季度:
    返回1
    def cmp_周(自身、其他):
    如果self.weekother.week:
    返回1
    def cmp_年度(自身、其他):
    如果自年<其他年:
    返回-1
    elif self.year==其他年份:
    返回0
    elif自我年度>其他年度:
    返回1
    定义报告(自我):
    返回“年:”+str(自年)+”\
    '季度:'+str(自我季度)+''\
    '月:'+str(self.month)+''\
    “周:”+str(self.week)+”\
    “日:”+str(self.day)+”
    @财产
    def周(自我):
    回归自我。\每周
    @财产
    def四分之一(自我):
    返回自我
    ed=ExtendDate(2011,1,2,3,4)
    打印类型(ed)
    每周打印一次
    
    当日期构造函数也需要Y/M/D时,为什么要创建一个包含冗余信息(如周和季度)的日期构造函数?如果用户使用冲突数据调用它怎么办?根据需要简单地计算周和季度不是更好吗?是的,我想给date类附加一些属性,以便在对象上缓存,而不是在外部函数中计算它。原因是封装。我认为“周”的概念可以放在日期的子类型中@JohnZwinckSide注意:您的比较代码非常复杂。即使您不使用现代风格的Py3丰富的比较函数(无可否认,从定义它们的类继承时使用比较烦人),您也可以替换defi
    from datetime import date
    
    
    class ExtendDate(date):
        """Extend to have week and quarter property"""
        __slots__ = '_week', '_quarter'
    
    
        def __new__(cls, year, month, day, week=None, quarter=None):
            # self = super(ExtendDate, cls).__new__(year, month, day)
            self = date.__new__(cls, year, month, day)
            self._week = week
            self._quarter = quarter
            return self
    
        def __cmp__(self, other):
            if self.cmp_year(other) in [-1,0,1]:
                return self.cmp_year(other)
    
            if hasattr(self, 'quarter'):
                return self.cmp_quarter(other)
    
            if hasattr(self, 'week'):
                return self.cmp_week(other)
            # TODO: test - what if it's just a normal date object ?
            pass
    
        def cmp_quarter(self, other):
            if self.quarter < other.quarter:
                return -1
            elif self.quarter == other.quarter:
                return 0
            elif self.quarter > other.quarter:
                return 1
    
        def cmp_week(self, other):
            if self.week < other.week:
                return -1
            elif self.week == other.week:
                return 0
            elif self.week > other.week:
                return 1
    
        def cmp_year(self, other):
            if self.year < other.year:
                return -1
            elif self.year == other.year:
                return 0
            elif self.year > other.year:
                return 1
    
        def __repr__(self):
            return 'year:' + str(self.year) + ' ' + \
                  'quarter:' + str(self.quarter) + ' ' + \
                  'month:' + str(self.month) + ' '+ \
                  'week:' + str(self.week) + ' '+ \
                  'day:' + str(self.day) + ' '
    
    
        @property
        def week(self):
            return self._week
    
        @property
        def quarter(self):
            return self._quarter
    
    
    ed = ExtendDate(2011,1,2,3,4)
    print type(ed)
    print ed._week