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,居然也打印出来了。
#说明了什么?
