python--基础知识点--

    技术2022-07-11  99

    一、普通使用

    序列协议:绑定了__getitem__方法的对象被认为是序列。 __getitem__:如果类把某个属性定义为序列,可以使用__getitem__输出序列属性中的某个元素。把绑定__getitem__()方法的实例对象称为自定义序列对象。 __setitem__:如果类把某个属性定义为序列,可以使用__setitem__修改序列属性中的某个元素。 __delitem__:如果类把某个属性定义为序列,可以使用__delitem__删除序列属性中的某个元素。

    1、类把某个属性定义为列表
    class Test: def __init__(self, names): self.names = names def __getitem__(self, item): return self.names[item] def __setitem__(self, key, value): self.names[key] = value def __delitem__(self, key): del self.names[key] names = ["zhangsan", "lisi", "wangwu", "zhaoliu"] test = Test(names) print("++++++++++++++++++++") for name in test: print(name) print("++++++++++++++++++++") print(test[1]) print(test[1:3]) test[1] = "test" print(test.names) del test[1] print(test.names) print() """ 运行结果: ++++++++++++++++++++ zhangsan lisi wangwu zhaoliu ++++++++++++++++++++ lisi ['lisi', 'wangwu'] ['zhangsan', 'test', 'wangwu', 'zhaoliu'] ['zhangsan', 'wangwu', 'zhaoliu'] Process finished with exit code 0 """
    2、类把某个属性定义为字典
    class Test: def __init__(self, names): self.names = names def __getitem__(self, item): if isinstance(item, int): # 当Test实例对象被转换成迭代器时,传递的item值是个数值,表示第几次迭代。 if item >= len(self.names): raise StopIteration return self.names["name"+str(item)] else: # 当Test实例对象未被转换成迭代器时,传递的item为字典的key return self.names[item] def __setitem__(self, key, value): self.names[key] = value def __delitem__(self, key): del self.names[key] names = {"name0": "zhangsan", "name1": "lisi", "name2": "wangwu", "name3": "zhaoliu"} test = Test(names) print("++++++++++++++++++++") for name in test: print(name) print("++++++++++++++++++++") print(test["name1"]) test["name1"] = "test" print(test.names) del test["name1"] print(test.names) print() """ 运行结果: ++++++++++++++++++++ zhangsan lisi wangwu zhaoliu ++++++++++++++++++++ lisi {'name0': 'zhangsan', 'name1': 'test', 'name2': 'wangwu', 'name3': 'zhaoliu'} {'name0': 'zhangsan', 'name2': 'wangwu', 'name3': 'zhaoliu'} Process finished with exit code 0 """
    3、类把某个属性定义为元组
    class Test: def __init__(self, names): self.names = names def __getitem__(self, item): return self.names[item] def __setitem__(self, key, value): self.names[key] = value def __delitem__(self, key): del self.names[key] names = ("zhangsan", "lisi", "wangwu", "zhaoliu") test = Test(names) print("++++++++++++++++++++") for name in test: print(name) print("++++++++++++++++++++") print(test[1]) print(test[1:3]) """ 运行结果: ++++++++++++++++++++ zhangsan lisi wangwu zhaoliu ++++++++++++++++++++ lisi ('lisi', 'wangwu') Process finished with exit code 0 """
    4、类把某个属性定义为集合同理
    5、类把某个属性定义为字符串同理

    注意:类把某个属性定义为某个序列,序列是可变数据类型还是不可变数据类型,类型不同操作可能不同。

    二、将含有__getitem__的实例对象转换成迭代器运行的原理

    以类把某个属性定义为列表为例:

    from collections import Iterable, Iterator class Test: def __init__(self, names): self.names = names def __getitem__(self, item): print("__getitem__") return self.names[item] def __setitem__(self, key, value): self.names[key] = value def __delitem__(self, key): del self.names[key] names = ["zhangsan", "lisi", "wangwu", "zhaoliu"] test = Test(names) print(isinstance(test, Iterable)) print(isinstance(test, Iterator)) print("++++++++++++++++++++") for name in test: print(name) print("++++++++++++++++++++") print(isinstance(test, Iterable)) print(isinstance(test, Iterator)) print("++++++++++++++++++++") print(test[1]) print(test[1:3]) test[1] = "test" print(test.names) del test[1] print(test.names) print() print("***************运行原理-for...in...*******************") names = ["zhangsan", "lisi", "wangwu", "zhaoliu"] test = Test(names) print(isinstance(test, Iterable)) print(isinstance(test, Iterator)) print(hasattr(test, "__iter__")) print(hasattr(test, "__next__")) print("++++++++++++++++++++") # 为test对象添加__iter__()和__next__(),解释器会在__next__()中自动调用__getitem__(), __next__()调用__getitem__()时传递的item值是个数值,表示第几次迭代。 test = iter(test) while True: try: print(next(test), end='') except StopIteration as ret: break print("++++++++++++++++++++") print(hasattr(test, "__iter__")) print(hasattr(test, "__next__")) print(isinstance(test, Iterable)) print(isinstance(test, Iterator)) print("***************运行原理-for...in...*******************") """ 运行结果: False False ++++++++++++++++++++ __getitem__ zhangsan __getitem__ lisi __getitem__ wangwu __getitem__ zhaoliu __getitem__ ++++++++++++++++++++ False False ++++++++++++++++++++ __getitem__ lisi __getitem__ ['lisi', 'wangwu'] ['zhangsan', 'test', 'wangwu', 'zhaoliu'] ['zhangsan', 'wangwu', 'zhaoliu'] ***************运行原理-for...in...******************* False False False False ++++++++++++++++++++ __getitem__ zhangsan__getitem__ lisi__getitem__ wangwu__getitem__ zhaoliu__getitem__ ++++++++++++++++++++ True True True True ***************运行原理-for...in...******************* Process finished with exit code 0 """
    Processed: 0.010, SQL: 9