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)))
'''

 

 
posted @ 2024-05-10 00:26  jason8826  阅读(3)  评论(0编辑  收藏  举报