魔法方法
魔法方法
__call__
-
__call__
对象()调用的是这个类中的__call__
下面的逻辑 -
如果类中有
__call__
这个方法,那就证明这个类的对象是可以被调用的 -
class Longin: def __call__(self, *args, **kwargs): print('-------') obj=Longin() print(callable(obj)) obj() # True # -------
__len__
- len(对象)需要实现这个类中的
__len__
方法
class Clas(object):
def __init__(self,name):
self.name=name
self.student=[]
def __len__(self):
return len(self.student)
clas=Clas('1902') #创建班级
clas.student.append('baoli') #添加学生
clas.student.append('yuhan') #添加学生
clas.student.append('jihang') #添加学生
print(len(clas))
# 3
__new__
-
实例化的时候,先创建一块对象的空间,有一个指针可以指向类 (这些是new完成的),然后在调用init
-
new只能使用父类的,不能重新定义
-
class A(object): def __init__(self): print('init') def __new__(cls, *args, **kwargs): print('new') return object.__new__(cls) #return super().__new__(cls) A() # new # init
-
设计模式(23种)
-
单例模式:一个类从头到尾只会实例一次,创建一次self空间
-
使用的是一个内存空间,第二次的对象属性会对第一次的属性经行覆盖
-
class Baby(object): __san=None #相当于一个空间名 def __new__(cls, *args, **kwargs): if Baby.__san is None: Baby.__san = super().__new__(cls) return Baby.__san def __init__(self,cloth,pants): self.cloth=cloth self.pants=pants a=Baby('红毛衣','绿皮裤') b=Baby('白衬衫','黑裤子') print(a.cloth) print(b.cloth) # 白衬衫 # 白衬衫
-
-
__str__
-
当我们打印一个对象用str进行拼接,或者str(对象)总是调用这个对象的str方法
-
如果找不到str就调用repr
-
__repr__
不仅是__str__
的替代品,还有自己的功能,当遇到%r或repr(对象)总是调用repr这个方法 -
在没有str方法的时候repr可以当作str的替代品具有str的功能,str不能操作repr
class Cla(object): def __init__(self): self.student=['123'] def stu(self,al): self.student.append(al) def __str__(self): return str(self.student) cla=Cla() cla.stu('123456') print(str(cla)) print(cla) 得: ['123', '123456'] ['123', '123456']
__repr__
__repr__
不仅是__str__
的替代品,还有自己的功能,当遇到%r或repr(对象)总是调用repr这个方法- 在没有str方法的时候repr可以当作str的替代品具有str的功能,str不能操作repr
class Cla(object):
def __init__(self):
self.student=['123']
def stu(self,al):
self.student.append(al)
def __repr__(self):
return str(self.student)
cla=Cla()
cla.stu('123456')
print(str(cla))
print(cla)
print(repr(cla))
print('%r sfdsfgdsf'%cla)
# ['123', '123456']
# ['123', '123456']
# ['123', '123456']
# ['123', '123456'] sfdsfgdsf