7.类特殊成员
# __new__()方法 class Foo(): def __new__(cls,a): print("__new__():",a) instance = super().__new__(cls) # __new__是传入类cls,返回一个实例对象 return instance def __init__(self,b): # __init__传入实例对象self print("__init__():",b) test1 = Foo("abc") # __new__的返回值正是__init__中self # __del__()方法,销毁实例化对象 class Demo1: def __init__(self): print("调用__init__构造对象") def __del__(self): print("调用__del__销毁对象") demo1 = Demo1() del demo1 # __dir__()方法,查看对象拥有的属性名和方法名 class Demo2: a = 1 b = 2 def __init__(self): self.name = "kbqlm" def say(self): pass demo2 = Demo2() print(dir(demo2)) print(demo2.__dir__()) # __dict__属性,查看对象内部所有的属性名和属性值组成的字典 print(demo2.__dict__) # hasattr(obj, name)判断实例对象是否包含指定名称的属性或方法 class Demo3: a = 1 b = 2 def __init__(self): self.name = "kbqlm" def say(self): pass demo3 = Demo3() print(hasattr(demo3,"a")) print(hasattr(demo3,"name")) print(hasattr(demo3,"say")) # getattr(obj, name[, default])获取实例对象中指定属性的值,如果找不到指定的name,则返回default print(getattr(demo3,"a")) print(getattr(demo3,"name")) # setattr(obj, name, value)修改实例对象中属性的值 setattr(demo3,"a","1_") setattr(demo3,"name","kbqlm_") print(demo3.a) print(demo3.name) # __call__()方法 class Demo4: def __init__(self,name): print("执行__init__:",name) def __call__(self,name,age): print("执行__call__:",name,age) demo4 = Demo4('kbq1') demo4("kbq2",18) # 使得实例对象可以向调用普通函数那样,以“对象名()”的形式使用 demo4.__call__("kbq2",18) # 生成器函数,相比迭代器,生成器最明显的优势就是节省内存空间,即它不会一次性生成所有的数据,而是什么时候需要,什么时候生成 # 条件1:定义一个以yield关键字标识返回值的函数 # 条件2:调用刚刚创建的函数,即可以创建一个生成器 # 效果:调用生成器函数,python解释器不会执行函数中的代码,它只会返回一个生成器(对象) def Num(): print("开始执行") for i in range(5): yield i # 和return相比,yield除了返回相应的值,还会在程序执行完该语句时,程序就会暂停执行 print("继续执行") num1 = Num() # 想要使生成器函数执行 # 方法1:调用__next__()方法 print('调用__next__()',num1.__next__()) print('调用__next__()',num1.__next__()) # 方法2:调用for循环遍历生成器 for i in num1: print('调用for循环',i) # 方法3:将num1转换成列表或者元组 # list(num1)或tuple(num1) # @函数装饰器 def funA(fun): print("1111") fun() print("3333") return "装饰器函数的返回值" @funA # 相当于funA(funB) def funB(): print("2222") # 带参数的装饰器 def funA(fun): def say(obj): print("定义的嵌套函数输出:",obj) return say @funA # 相当于funB = funA(funB) def funB(arc): pass funB("参数") # 装饰器嵌套 ''' @funA @funB @funC def fun() # 相当于funA(funB(funC(fun))) '''