标签:
class Class1:
def __getitem__(self, item):print(‘getitem , get:{}, type:{}‘.format(item, type(item)))
def __setitem__(self, key, value):print(‘setitem , key:{} value:{}, type:{},type:{}‘.format(key, value, type(key), type(value)))
def __delitem__(self, key):print(‘delitem, key:{}, type:{}‘.format(key, type(key)))
# 实例化并调用obj = Class1()obj[‘test1‘] #“对象索引”,自动触发执行__getitem__()方法obj[‘test2‘] = ‘value2‘ #“对象索引”赋值,自动触发执行__setitem(key,value) 方法,并将索引的key和值value传给形参del obj[‘test3‘] # 删除“对象索引”,自动触发执行 __delitem__(self,key) 方法,并自动将索引的key传递给形参
class Class1:
def __getitem__(self, item):print(item, type(item))print(‘item start:{}‘.format(item.start))print(‘item stop:{}‘.format(item.stop))print(‘item step:{}‘.format(item.step))
def __setitem__(self, key, value):print(key, type(key), value, type(value))print(‘key start:{}‘.format(key.start))print(‘key stop:{}‘.format(key.stop))print(‘key step:{}‘.format(key.step))print(‘value:{}‘.format(value))
def __delitem__(self, key):print(key, type(key))print(‘key start:{}‘.format(key.start))print(‘key stop:{}‘.format(key.stop))print(‘key step:{}‘.format(key.step))
# 实例化并执行obj = Class1()obj[1:2:3] # 对象切片,会自动执行__getitem__(self, item) 函数,并将[start:stop,step] 传递给 slice 对象obj[1:2:3] = [1, 2, 3, 4, 5] # 切片赋值,会自动执行__setitem__(slef,key,value) 函数,并将 [start:stop,step] 传递给 slice 对象 key; 值赋给 valuedel obj[1:2:3] # 切片删除,会自动执行__delitem__(self, key) 函数,并将[start:stop,step] 传递给 slice 对象
class Mydic(dict):def __init__(self):self.lst = []super(Mydic, self).__init__()
def __setitem__(self, key, value):self.lst.append(key)super(Mydic, self).__setitem__(key, value)
def __str__(self):temp_lst = []for x in self.lst:dic_value = super(Mydic, self).get(x)temp_lst.append(‘{}:{}‘.format(x, dic_value))f_dic = ‘{‘ + ‘,‘.join(temp_lst) + ‘}‘return f_dic # __str__ 方法 return什么值,就输出什么值
# 实例化并调用obj = Mydict()obj[‘k1‘] = 123obj[‘k2‘] = 456obj[‘k3‘] = 789obj[‘k4‘] = ‘abc’print(obj) # 调用__str__ 方法,此时每次输出的都是有序字典
class Class1:def __init__(self, ):self.number = 0
def __iter__(self):return self # 拥有__iter__方法的对象,就为迭代器,所以自定义迭代器通常返回对象实例自己
def __next__(self):if self.number >= 10:raise StopIterationelse:self.number += 2return self.number# 实例化并执行obj = Class1()for x in obj:print(x)
# 经常用于执行父类中与子类同名的方法:
class C1:def f1(self):print(‘c1.f1‘)
class C2(C1):
def f1(self):
# 表示主动执行父类中的f1方法super(C2,self).f1() # 第一中方法print(‘c2.f1‘)
obj = C2()
--------------------------------公司代码场景# 老员工NB代码核心逻辑vim backend/commons......nb的代码,其中有个Foo类
# 程序配置文件vim settings.pyPath = ‘bakend.commons‘ // 模块所在路径ClassName = ‘Foo‘ //所需要的目标类
# 老员工NB代码入口vim index.pyfrom settings import Path 类所在模块的路径from settings import ClassName 所需要调用的类名
def excute():module = __import(Path,fromlist=True) # 从路径中找到目标模块cls = getattr(commons, ClassName) # 从目标模块中找到目标类obj = cls()obj.func1() # 领导要求对该功能进行封装 ,该功能存在于核心逻辑中,核心逻辑文件不能修改,该入口文件也不能改,总之什么都不能改
if __nam__ == ‘__main__‘:excute()
# 封装功能的文件vim lib.pyfrom backend.commons import Foo # 导入要被封装的类
class my_class(Foo): # 新建一个类,并继承老员工的类def func1(self):print(‘before‘)super(my_class, self).func1() //执行老员工Foo类中的原本的功能print(‘after‘) // 新增功能# 修改配置文件vim setting.pyPath = ‘lib‘ClassName = ‘my_class‘
标签:
原文地址:http://www.cnblogs.com/qiaogy/p/5818668.html