Python 扩展日期类
我对用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):
date
类有异议
然而,由于date是静态类,所以我并没有让它按预期的方式工作。我试图根据datetime
修改代码,因为这个类是从date
扩展而来的。然而,他失败了
问题是:
\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