首页 > 解决方案 > 怎么换班为 Python 类型

问题描述

我是 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

IE:

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到底有什么误解?我应该阅读哪些概念来帮助我理解?

感谢所有信息,谢谢

标签: pythonarrayspython-3.xclass

解决方案


所以,事实证明这test_set是一个实例,SomeObject这就是为什么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()字典的每个键。


推荐阅读