一、property属性高级用法 可以将对象方法作为属性使用 例子: class Foo: def __init__(self, age): ) self.__age = age @property def age(self): return self.__age @age.setter def age(self, args): self.__age = args @age.deleter def age(self): del self.__age obj = Foo(20) print(obj.age) obj.age = 3 print(obj.age) del obj.age print(obj.age) class Foo: def __init__(self, age): self.__age = age def get_age(self): return self.__age def set_age(self, args): self.__age = args def del_age(self): del self.__age age = property(get_age, set_age, del_age) obj = Foo(20) print(obj.age) obj.age = 3 print(obj.age) del obj.age print(obj.age) __str__方法,默认返回对象内存地址,可以修改重写默认方法 例子: class Foo: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return ‘name: %s, age: %s‘ %(self.name, self.age) obj = Foo(‘egon‘, ‘18‘) print(obj) __getitem__, __setitem__,__delitem__可以通过字典的方式调用属性和方法 例子: class Foo: def __init__(self, name): self.name = name def __getitem__(self, item): print("getitem") return self.__dict__[item] def __setitem__(self, key, value): print("setitem", key, value) self.__dict__[key] = value def __delitem__(self, key): print(‘del obj[key]时,执行‘) self.__dict__.pop(key) obj = Foo(‘egon‘) print(obj.name) #obj.name = ‘alex‘ #obj[‘name‘] = ‘alex‘ print(obj[‘name‘]) del obj[‘name‘] print(obj[‘name‘]) __call__回掉函数,可以将对象变成可调用的 例子: class Foo: def __call__(self, *args, **kwargs): print(‘====>‘) obj = Foo() obj() __getattr__ 从对象中读取某个属性时,首先需要从self.__dicts__中搜索该属性,再从__getattr__中查找 __setattr__用来设置对象的属性,通过object中的__setattr__函数来设置属性 __delattr__用来删除对象的属性 例子: class Foo: def __init__(self, x): self.x = x def __getattr__(self, item): print(‘getattr‘) def __setattr__(self, key, value): self.__dict__[key] = value def __delattr__(self, item): self.__dict__.pop(item) obj = Foo(10) obj.x = 1 print(obj.__dict__) del obj.x print(obj.__dict__) obj.a = 1 obj.b = 2 print(obj.__dict__) del obj.a print(obj.__dict__) print(obj.aaaaaaaaa exec函数,将字符串中的python代码提取出来执行 例子: s="print(x)" g={‘x‘:100000000} l={‘x‘:1} exec(s,g,l) s = "y=2" exec(s, g, l) print(g) print(l)
二、二次加工标准类
例子:
(): (itemtag=): ().(item) .tag=tag (p_object): (p_object): (%p_object) (List).append(p_object) (): mid_index=()//[mid_index] (): .tag: () ().clear() .tag=l=List([]) (l) (l.mid)
实现迭代器协议 例子: class Foo: def __init__(self, n, stop): self.n = n self.stop = stop def __next__(self): if self.n > self.stop: raise StopIteration x = self.n self.n += 1 return x def __iter__(self): return self obj = Foo(0, 5) print(next(obj)) print(next(obj)) print(next(obj)) 实现上下文管理器: 例子: class Foo: def __init__(self, name): self.name = name def __enter__(self): print(‘enter‘) return self def __exit__(self, exc_type, exc_val, exc_tb): print(‘exit‘) with Foo(‘alex‘) as x: print(x) print(‘=>‘) print(‘=>‘) print(‘=>‘)
时间: 2024-10-07 06:30:09