魔法方法

魔法方法

__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
posted @ 2021-06-03 16:41  刘家小仙女  阅读(67)  评论(0编辑  收藏  举报