知识点列表清单:
名字
1、这类方法叫做类中的特殊方法、内置方法,双下划綫方法、魔术方法
2、雷钟德每一个双下划线方法都有它自己的特殊意义
call flask
new :特别重要
* 写一个单例类
len
str、repr
# __call__
class A:
def __call__(self,*args,**kwargs):
print("我是call方法")
a = A()() # 相当于a = A() a()
a # 相当于调用__call__方法
我是call方法
class B:
def __init__(self,cls):
self.a = cls()
self.a()
B(A)
我是call方法
<__main__.B at 0x13f1fdc9fd0>
class Demo(object):
def __init__(self, a, b):
self.a = a
self.b = b
def my_print(self,):
print("a = ", self.a, "b = ", self.b)
def __call__(self, *args, **kwargs):
self.a = args[0]
self.b = args[1]
print("call: a = ", self.a, "b = ", self.b)
if __name__ == "__main__":
demo = Demo(10, 20)
demo.my_print()
demo(50, 60) #需要注意的是:只有当在类中定义了 def __call__() 方法后,才可以实现这个功能,否则会出现语法错误,就是文档中解释的 if this method is defined 的意思。
a = 10 b = 20
call: a = 50 b = 60
object.call(self[, args…])
Called when the instance is “called” as a function; if this method is defined, x(arg1, arg2, …) is a shorthand for x.call(arg1, arg2, …).
主要实现的是将类的对象当作函数直接调用
# __iter__
def my_iter(obj):
return obj.__iter__()
l = [1,2,3,4,5]
my_iter(l)
for i in my_iter(l):
print(i)
1
2
3
4
5
# __len__ 方法
# len(tuple) str\list\set
class mylist:
def __init__(self):
self.lst = [1,2,3]
def __len__(self):
return 111
ls = mylist()
print(len(ls)) # len()方法其实就是调用的对象的__len__方法
111
class mylist:
def __init__(self,lst):
self.lst = lst
def __len__(self):
return len(self.lst)
ls = mylist([11,22,334,5,4,3,2,1])
print(len(ls))
8
小结:
len
len(obj)相当于调用了这个对象的__len__方法,__len__方法return的值就是len函数的返回值
内置函数和内置方法是有联系的。
new ==> 构造方法
init ==> 初始化方法
#面向对象实例化:
#1、开辟一个空间,属于对象的(__new__构造函数)
#2、把对象的空间传给self,执行init
#3、将这个对象的空间返回给调用者
class Single:
def __new__(cls,*args,**kwargs):
print("new")
return object.__new__(cls)
def __init__(self):
print("init")
obj = Single()
# 先执行的__new__再执行的__init__方法
# 先调用single中的new方法,如果没有new方法则调用object类的new方法
new
init
单例类
如果一个类,从头到尾只能有一个实例,那么这个类就是单例类
class A:pass
a = A()
a1 = A()
print(a,a1)
<__main__.A object at 0x0000013F1FEA2550> <__main__.A object at 0x0000013F1FEA2518>
# 单例类
class A: # step1
__isinstance = None # step2
def __new__(cls,*args,**kwargs): # step3 # step6 # step13
if not cls.__isinstance: # step7 # step14
cls.__isinstance = object.__new__(cls) #step8
return cls.__isinstance #step9 # step15
def __init__(self):pass # step4 #step10 #step16
a = A() # step5 #step11
a1 = A() # step12 # step17
print(a,a1)
<__main__.A object at 0x0000013F1FDC93C8> <__main__.A object at 0x0000013F1FDC93C8>
# __str__
ls = [1,2,3] #实例化一个list对象
print(ls)
[1, 2, 3]
# 不使用__str__
class A:
def __init__(self,name):
self.name =name
a = A("周杰伦")
print(a)
<__main__.A object at 0x0000013F1FDF5748>
# 使用__str__
class A:
def __str__(self):
return self.name + ',' + str(self.age)
def __init__(self,name,age):
self.name =name
self.age = age
a = A("周杰伦",19)
print(a)
周杰伦,19
# str(oobj)相当于执行obj.__str__()方法