首页 > 解决方案 > 在以下场景中实施 __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__我们可以使用特殊方法 过滤记录吗?

标签: python

解决方案


所以我会这样解决它:

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。否则返回实例。希望有帮助。


推荐阅读