序言
正常情况下, 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 属性提取出来,使用的是内置函数 dir
和 callable
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
测试一下重新部署后的邮件功能
@Leon 应该正常吧