python - 在以下场景中实施 __new__ 方法时需要帮助
问题描述
我想知道使用__new__
特殊方法是否可以使用以下场景。如果是这样,我想听听 stackoverflow 的消息。我有类名Listing
,它从文件中读取记录,然后在查询中转换它们。简而言之,最初的代码片段从文件中读取所有行并将它们转换为列表列表。同样,这个列表列表被传递给 Event 的 loadlist 方法,该方法读取每个列表,解包然后将它们设置为类属性。
例如,我有以下三个记录
1|305|8|1851|Gotterdammerung|2008-01-25 14:30:00
2|306|8|2114|Boris Godunov|2008-10-15 20:00:00
3|302|8|1935|Salome|2008-04-19 14:30:0
在这里,Listing.py
读取上面的内容并将它们转换为下面给出的查询
INSERT INTO EVENT (EVENTID,VENUEID,CATID,DATEID,EVENTNAME,STARTTIME) VALUES ('1','305','8','1851','Gotterdammerung','2008-01-25 14:30:00')
INSERT INTO EVENT (EVENTID,VENUEID,CATID,DATEID,EVENTNAME,STARTTIME) VALUES ('2','306','8','2114','Boris Godunov','2008-10-15 20:00:00')
INSERT INTO EVENT (EVENTID,VENUEID,CATID,DATEID,EVENTNAME,STARTTIME) VALUES ('3','302','8','1935','Salome','2008-04-19 14:30:00')
整个节目Listing.py
class Event:
def __init__(self,eventid,venueid,catid,dateid,eventname,starttime):
self.eventid = eventid
self.venueid = venueid
self.catid = catid
self.dateid = dateid
self.eventname = eventname
self.starttime = starttime
def __iter__(self):
return (i for i in (self.eventid,self.venueid,self.catid,self.dateid,self.eventname,self.starttime))
def __str__(self):
return str(tuple(self))
def __repr__(self):
return "INSERT INTO EVENT (EVENTID,VENUEID,CATID,DATEID,EVENTNAME,STARTTIME) VALUES ({!r},{!r},{!r},{!r},{!r},{!r})".format(*self)
@classmethod
def loadlist(cls,records):
return [cls(*record) for record in records]
if __name__ == '__main__':
records = []
with open('tickitdb/allevents_pipe.txt','r') as f:
records = list(map(lambda s:s.rstrip('\n').split('|'),f.readlines()))
events = Event.loadlist(records=records)
with open('events.sql','w+') as f:
print('writing file')
for event in events:
f.write(repr(event)+"\n")
当我运行程序时,我遇到了以下错误。
TypeError: __init__() missing 5 required positional arguments:
. 我找出了这背后的根本原因。当程序读取文件并将它们转换为记录列表时,有一个空的记录没有,例如
1.['1','305','8','1851','Gotterdammerung','2008-01-25 14:30:00']
2.['2','306','8','2114','Boris','Godunov','2008-10-15 20:00:00']
3.['3','302','8','1935','Salome','2008-04-19 14:30:0']
4.['']
对于第 4 条记录,没有值。因此,为避免此类错误,我决定使用__new__
特殊方法。if
我可以通过设置条件然后检查列表是否为空来实现相同的功能。但后来我想知道如何利用新的特殊方法来避免这种情况。由于对python知之甚少,我已经填写了新的特殊方法,但后来我遇到了以下错误
RecursionError: maximum recursion depth exceeded while calling a Python object
def __new__(cls,*args,**kwargs):
if len(args) != 0:
instance = Event.__new__(cls,*args,**kwargs)
return instance
__new__
我们可以使用特殊方法 过滤记录吗?
解决方案
所以我会这样解决它:
class Event:
def __init__(self, a, b):
self.a = a
self.b = b
def __new__(cls, *args, **kwargs):
if len(args) != 0:
return super(Event, cls).__new__(cls)
else:
return None
def print(self):
print("a " + str(self.a))
print("b " + str(self.b))
c = Event(1, 2)
if c is None:
print("do some stuff here if it is empty")
如果您在没有参数的情况下初始化 Event,它将根据 len(args) != 0 返回 None。否则返回实例。希望有帮助。
推荐阅读
- docx4j - 使用 docx4j 不读取字体大小样式的 XHTML 到 Docx 转换
- mendix - 在 Mendix 中更新实体时,数据视图未更新
- c - 给定代码场景的时间复杂度
- python - python '环境已经崩溃'
- python - 使用谷歌存储和谷歌视觉 API
- javascript - 在多级下拉菜单中,如何防止子菜单重叠
- python - 如何使用证书和 rsa 密钥连接到服务器
- tomcat - 登录到 jaspersoft 时重定向循环
- javascript - jQuery - 如何用标签包装输入标签
- amazon-cloudformation - 如何将角色传递给 cli 命令“aws cloudformation deploy”或“sam deploy”?