Python测试开发预习课9/3

1、def call(self)

def p():
    print(1)


p    #函数对象
p()  #调用函数(调用函数对象)
class Person:

    def __call__(self):  #此方法用于实例被调用
        print("一个person的实例被调用了!")


p = Person()

p()  #调用类里面的__call__方法

在这里插入图片描述

2、 def len(self)

class Person:

    def __call__(self):  #此方法用于实例被调用
        print("一个person的实例被调用了!")


    def __call__(self):  #此方法用于实例被调用
        print("一个new person的实例被调用了!")


    def __len__(self):
        return 1000


p = Person()

p()  #调用类里面的__call__方法

print(len(p))

在这里插入图片描述

3、 def add(self,other)

class Person:

    def __init__(self,height):
        self.height = height

    def __call__(self):  #此方法用于实例被调用
        print("一个person的实例被调用了!")


    def __call__(self):  #此方法用于实例被调用
        print("一个new person的实例被调用了!")


    def __len__(self):
        return 1000

    def __add__(self,other):
        return self.height+other.height
p1 = Person(100)
p2 = Person(200)
print(p1 + p2)

'''
#当你是个person的实例(p1)的时候,后面有个加号,那么就会调用__add__方法。
这时__add__(self,other)的self--->p1 ,other就是加号后面的对象(p2)
self.height+other.height---->p1.height(100)     other.height--->p2.height(200)
表达式返回了300
'''

在这里插入图片描述

4、 def new(cls, *args, **kw)

#设计模式,用类的方法来实现一些数据,实例的管理
#单列,实例化多次,但是只有一个实例产生
class Singleton(object):
    _instance = None  #类变量,可以用类名.类变量来调用。默认类变量是None

    def __init__(self):
        print("__init__被调用了")

    def __new__(cls, *args, **kw):
        print("__new__方法被调用了。")
        #cls._instance ---》_instance
        if cls._instance is None:#如果类变量是None,那么生成一个新的实例,存到这个类变量中
            cls._instance = object.__new__(cls) #基类object.__new__(cls)会调用__init__方法

        #如果第一次实例化,会触发这个if,把实例对象存到类变量里面
        #如果不是第一次实例化了,不会触发if,直接返回类变量里面存储的实例
        return cls._instance  

# 示例:
a = Singleton()
#b = Singleton()
print(id(a))
#print(id(b))

在这里插入图片描述

'''
class Person:
    pass

p1 = Person()
p2 = Person()

print(id(p1))
print(id(p2))
'''


class Singleton(object):
    _instance = None  #类变量,可以用类名.类变量来调用。默认类变量是None

    def __init__(self):#如果__new__方法执行后没有返回实例,则__init__方法不执行
        print("__init__被调用了")

    def __new__(cls, *args, **kw):
        print("__new__方法被调用了。")
        if cls._instance is:#因为if只会被触发执行一次,所以只能被实例化一次
            cls._instance = object.__new__(cls)#真正生成一个新的实例的有效语句。
        return cls._instance  #有值返回---》说明实例化成功(生成内存地址了),然后就调用__init__了

# 示例:
a = Singleton()#调用一次__new__

b = Singleton()#调用一次__new__

#真实的实例生成,是__new__方法生成的,不是__init__方法生成的。



class Singleton(object):
    _instance = None  #类变量,可以用类名.类变量来调用。默认类变量是None

    def __init__(self):#如果__new__方法执行后没有返回实例,则__init__方法不执行
        print("__init__被调用了")

    def __new__(cls, *args, **kw):#默认
        
        return object.__new__(cls)

# 示例:
a = Singleton()#调用一次__new__

b = Singleton()#调用一次__new__

print(id(a))

print(id(b))

在这里插入图片描述

5、闭包

#闭包:一个函数p,在p函数的内部return了一个函数x+函数使用的外部变量a
def add(a,b):return a+b
def p():
    return add#返回的是函数对象
print(p()(1,2))

def p():
    a=1
    def x():
        print(a)
    return x  #返回的是函数对象x,有没有a呢?------》有,且a依旧在函数的外面(且你看不见)---》闭包
              #使用发挥的函数对象去调用时,这个a会被自动找到,并使用
              #等于编译器返回了x函数+a(你在调用时才可以访问到的a,也只能x使用)
 

p()()

#p() ---->拿到了x的函数对象
#p()()等价于x()---->调用了x

#问题来了:x里面要打印a,居然也打印出来了。
#说明了什么?

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值