欢迎光临!
若无相欠,怎会相见

Python 魔法方法 __contains__

序言

正常情况下, Python 的魔术方法是用不到的, 但是有一些高级的用法, 可以通过魔术方法进行定制。

本次就用 __contains__() 方法, 这个方法在使用的时候相关联的关键字是 in 。 我使用这个函数是因为我用 class 存储了一些固定的字符串, 然后判断目标是否是这些字符串中的, 因此对 class 的魔术方法进行了定制。

解析

在 Python 中关键字 in 用于判断可迭代对象是否包含某个对象, 例如字符串是否包含特定字符(串), List 是否包含某个对象等。

举个例子:

class Contains:
    Test1: str = 'Test1'
    Test2: str = 'Test2'
    Test3: str = 'Test3'

    def __contains__(self, item):
        return item in self.__str__()

    def __str__(self):
        all_attr = []
        for i in dir(self):
            if (not callable(getattr(self, i))) and ('__' not in i):
                all_attr.append(getattr(self, i))
        return ','.join(all_attr)

    def __repr__(self):
        return self.__str__()


if __name__ == '__main__':
    print(Contains())
    print('Test1' in Contains())
    print('Test4' in Contains())

>>>Test1,Test2,Test3
>>>True
>>>False

解释一下, 先在  __str__ 函数中将 class 属性提取出来,使用的是内置函数 dircallable

dir 函数可以获取 class 的属性和方法, 结果类似:

['Test1', 'Test2', 'Test3', '__annotations__', '__class__', '__contains__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

然后使用 callable 函数判断是否是类方法, 然后在去除带有双下划线的名称, 就可以使用 getattr 函数提取出类属性了

结语

目前搞定了字符串的 in 判断, 还需要进一步研究 dict, list, set 等的 in 判断。 就先到此结束了,后面继续研究。

如有错误,敬请指出, 感谢指正!   — 2022-08-28  23:05:29

赞(0) 打赏
转载请注明:飘零博客 » Python 魔法方法 __contains__
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

欢迎光临