Python基础知识:检查对象是否在字符串集中

时间:2018-08-30 18:17:13

标签: python oop

如果我有课

class Kid():
  def __init(name):
    self.name = name

我应该添加什么才能做到这一点:

def is_cool(kid):
  cool_kids = {"Jim","Bill","Nebuchadnezzar II"}
  return kid in cool_kids

我必须从str继承Kid吗?

添加1:我知道我可以写return kid.name in cool_kids,但是我正在为我的代码寻找一点语法糖。我想要一种在非常不同的对象集中检查obj的方法。

3 个答案:

答案 0 :(得分:1)

您可以这样做:

class Kid:
    def __init__(self, name):
        self.name = name


def is_cool(kid):
    cool_kids = {"Jim", "Bill", "Nebuchadnezzar II"}
    return kid.name in cool_kids

print(is_cool(Kid("Daniel")))
print(is_cool(Kid("Jim")))

输出

False
True

您的代码有几个问题,您需要从Kid类定义中删除括号,并将方法__init更改为__init__,并将self作为第一个参数

更新

如果您想从str继承,您可以这样做:

class Kid(str):
    def __new__(cls, *args, **kw):
        return str.__new__(cls, *args, **kw)


def is_cool(kid):
    cool_kids = {"Jim", "Bill", "Nebuchadnezzar II"}
    return kid in cool_kids

print(is_cool(Kid("Daniel")))
print(is_cool(Kid("Jim")))

输出

False
True

您可以找到有关从str here继承的更多信息

答案 1 :(得分:1)

如何?

class Kid():
  def __init__(self, name):
    self.name = name

  def __eq__(self, other):
    return self.name == other

  def __ne__(self, other):
    return not self.name == other

  def __hash__(self):
    return hash(self.name)


def is_cool(kid):
  cool_kids = {"Jim","Bill","Nebuchadnezzar II"}
  return kid in cool_kids


if __name__ == "__main__":

    print is_cool(Kid("Bob"))
    print is_cool(Kid("Jim"))
    print is_cool(Kid("Bill"))

结果:

False
True
True

您需要同时覆盖__eq____hash__,因为必须同时满足一个元素才能成为哈希表的成员。当Python评估元素是否为哈希表的成员时,它首先查看哈希是否匹配,如果匹配,则查看相等性。在此示例中,不必覆盖__ne__,但是这样做是一个好习惯,因为您不希望等于和不等于不同步。

答案 2 :(得分:-1)

我怀疑以下内容会满足您的要求:

def is_cool(kid):
  cool_kids = {"Jim","Bill","Nebuchadnezzar II"}
  return kid.name in cool_kids