1、__call__就是一个重载了之后 对象实例可以拿来当做函数调用
例如:
class
Test:
def
__init__(self,a):
self.a = a
pass
def
__call__(self, b, c):
print
(
"call"
)
return
self.a+b+c
temp = Test(
12
)
tempAndswer = temp(
12
,
23
)
print
(tempAndswer)
call
47
可以看到Test类的实例temp可以当做函数调用call
temp(
12
,
23
)
2、
__new__()
自定义 __new__() 方法一般并不常用,而且容易与 __init__() 相混淆。实际上这两个方法也确实相似,比如他们都是在创建类的实例时会被默认调用的方法,而且创建实例时传入的参数也都会传到这两个方法里。但他们也有很重要的区别,比如对 __new__() 的调用比 __init__() 要早,__new__() 有返回值,__init__() 木有。
来理一下创建类的实例的过程,即解释器处理 foo = MyClass() 这条语句的步骤的话,大约是这样的(可能并不完全准确):
- 创建 foo 这个名字
- 调用 MyClass 类的 __new__() 静态方法,返回一个类实例
- 将__new__() 返回的类实例赋值给 foo
- 这个实例被当做 self 参数传给 __init__(),以完成该实例的初始化工作
【一些问题】:
1、Python如何实现单例模式:
3、python是如何进行类型转换的?
Python有两种实现单例模式的方法:
(1)利用__new__(cls,*args,**kwargs)
class
Singleton(object):
def
__new__(cls, *args, **kwargs):
if
not
hasattr(cls,
'_instance'
):
orig = super(Singleton,cls)
#这里是调用父亲的__new__( cls,*args ,**kw)
cls._instance = orig.__new__(cls,*args, **kwargs)
return
cls._instance
class
MyClass(Singleton):
pass
(2),共享属性;所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法)
#同一个类的所有实例天然拥有相同的行为(方法),
#只需要保证同一个类的所有实例具有相同的状态(属性)即可
#所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引用)同一个字典( dict)
#可参看:http://code.activestate.com/recipes/66531/
class
Borg(object):
_state = {}
def
__new__(cls, *args, **kw):
ob = super(Borg, cls).__new__(cls, *args, **kw)
ob.__dict__ = cls._state
return
ob
class
MyClass2(Borg):
a =
1
2、什么是lambda函数?
g = lambda x,y:x+y
g(12,12)
(
lambda
x,y=
0
,z=
0
:x+y+z)(
3
,
5
,
6
)
int('123123')
4、python是如何进行内存管理的?
是由python解释器来负责的
python内部使用引用计数来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建的时候就创建了一个引用计数
减少的情况:
(1)一个本地引用离开了它的作用域。比如上面的foo(x)函数结束,x指向的对象引用减1
(2)对象的别名被显示的销毁:del x
(3)一个对象的别名被赋值给其他对象:x=123
(4)list对象的减少 内容的引用计数也会跟着减少
【垃圾回收】:
它会去检查引用计数为0的对象 然后清除其在的内存的空间,当然除了引用计数为0的会被清除,还有一个情况也会被垃圾回收器清除 当两个对象互相引用时,而且没有其他的引用指向他们的时候
垃圾回收机制还有一个循环垃圾回收器,确保释放循环引用对象(a引用b,b引用a,导致其引用计数永远不为0)
python有内存池机制
【内存池机制】:
Python所有小于256字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc 另外Python对象,例如整数,浮点数和List 都有其独立私有的内存池对象间不共享他们的内存池 也就是如果你分配了大量的整数 用于缓存这些整数的内存就不能再分配给浮点数