Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python基础知识:检查对象是否在字符串集中_Python_Oop - Fatal编程技术网

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

Python基础知识:检查对象是否在字符串集中,python,oop,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继承孩子吗 添加1:我知道我可以在cool_kids中编写return kid.name,但我正在为我的代码寻找一点语法糖。我想要一种在一组非常

如果我有课

class Kid():
  def __init(name):
    self.name = name
我应该添加什么才能做到这一点:

def is_cool(kid):
  cool_kids = {"Jim","Bill","Nebuchadnezzar II"}
  return kid in cool_kids
我必须从str继承孩子吗


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

您可以这样做:

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")))
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
False
True
您的代码有一些问题,您需要从
Kid
类定义中删除括号,并将方法
\uuu init
更改为
\uuu init\uu
作为第一个参数传递
self

更新

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

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")))
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
False
True

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

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

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

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

您需要重写
\uuuuuueq\uuuu
\uuuuhash\uuuuuu
,因为要成为哈希表的成员,元素需要满足这两个条件。当Python计算元素是否为哈希表的成员时,它首先查看哈希是否匹配,如果匹配,则查看相等性。在本例中,重写
\uuu ne\uuuu
不是必需的,但这样做是一种很好的做法,您不希望equals和not equals不同步。

您的意思是
语法糖
?在cool_kids
中返回
kid.name是迄今为止最简单的解决方案。由于我简化了我的问题,可能会重复。我的实际孩子没有成员
name
或函数
name()
,我可以将孩子与str进行比较,但我无法生成名字,因为比较需要regexp杂耍。为了更好地了解您的上下文和问题,您能添加更复杂的示例吗?是的。这就是解决我的简化示例的原因。不幸的是,在实际情况中,我不能提供有意义的
哈希值
,因为孩子们的名字不一定要精确匹配。所以这是不可能的。我可以没有它,我只想在代码中有不那么显式的循环。@BarafuAlbino,我不认为你可以用
哈希
做你想要做的事情,你可以用
\uuuuueq\uuuu
做类似的事情,然后在你的元素集上迭代,并将每个元素与
kid
实例进行比较。然而,这将使你的
功能O(n)变得很酷,而不是像现在这样的O(1)。