我是OOP的新手,所以这也许是一种反模式,但是我有一个课程:

class SomeObject:

    """  WIP OBJECT  """

    parsed_dates = []

    def __init__(self, description, weekdays, months):
        self.description = str(description)
        self.weekdays = frozenset(SomeObject.flatn(weekdays))  # flat set of ints
        self.months = frozenset(SomeObject.flatn(months))  # flat set of ints


    def __repr__(self):
        return self.description

   ( ... )

    def accepts(self, dt):
        return any([
            dt.weekday() in self.weekdays,
            dt.month in self.months,
     ])



我建立一个defaultdict与:

def main(dt_start, dt_end, s: str):
    d = defaultdict(list)
    description = pull_desc(s=s)
    active_days = convert_tuples_to_numpy_array(description, np.str)
    SomeObject.active_days(active_days_for_meter)
    for test_set in SomeObject.parsed_dates:
        for dt in [dt for dt in SomeObject.date_range(dt_start, dt_end) if test_set.accepts(dt)]:
            # add the datetime objects to a list of values with the description as the key
            d[test_set].append(str(dt.isoformat()))
    return d



哪个返回:

defaultdict(<class 'list'>, {['Saturdays']: ['2020-01-04', '2020-01-11', '2020-01-18']}

现在,当我比较该defaultdict()的键(类似于列表)说时,Python不能将键识别为类型'__main__.SomeObject'>而不是类型list

即:

dic = {"Saturday": 1}

for k1, v2 in dic.items()
  for k2, v2 in defaultdict.items():
     if k1 == k2:
       print("Chicken Wing")


鸡翼永远不会打印,因为type(k1) = <str>
type(k2) = '<__main__.SomeObject'>

我该如何解决?
我对OOP到底有什么误解?
我应该阅读哪些概念以帮助我理解?

感谢所有信息,谢谢

最佳答案

因此,事实证明test_setSomeObject的实例,这就是type(k2) = '<__main__.SomeObject'>的原因。

似乎您缺少的是:

d[str(test_set)].append(str(dt.isoformat()))


然后您的__repr__()方法将启动。

更新:

main()返回defaultdict(<class 'list'>, {'Saturdays': ['2020-01-04', '2020-01-11', '2020-01-18']}的原因是您有一个__repr__()方法,并且defaultdict在字典的每个键上都调用str()

07-24 09:52
查看更多