• 内置方法


    1,__len__方法

    class A:
        def __init__(self,name,age,sex,cls):
            self.name = name
            self.age = age
            self.sex = sex
            self.cls = cls
        def __len__(self):
            return len(self.__dict__)
        
    a=A("张三","",18,6)
    print(len(a))
    View Code

    2,__hash__

    class A:
        def __init__(self):
            self.a = 1
            self.b = 2
    
        def __hash__(self):
            return hash(str(self.a)+str(self.b))
    a = A()
    print(hash(a))
    View Code

    3,__call__       对象名() 相当于调用类内置的__call__, 一个对象是否可调用 完全取决于这个对象对应的类是否实现了__call__

    class Teacher():
        def __call__(self):
            print(123)
    t = Teacher()
    t() 
    View Code

    4,__eq__        == 是由__eq__的返回值来决定的

    class A:
        def __init__(self):
            self.a = 1
            self.b = 2
    
        def __eq__(self,obj):
            if  self.a == obj.a and self.b == obj.b:
                return True
    a = A()
    b = A()
    print(a == b)
    View Code

    5,__del__       析构方法,当对象在内存中被释放时,自动触发执行,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

    class Foo:
    
        def __del__(self):
            print('执行我啦')
    
    f1=Foo()
    del f1
    print('------->')
    
    #输出结果
    执行我啦
    ------->
    View Code

    6,__new__     构造方法,该方法会创造一个对象,默认传一个类(cls)参数,执行完构造方法后,再执行__init__

    单例模式:即一个类只能有一个实例

    class B:
        __instance = None
        def __new__(cls, *args, **kwargs):
            if cls.__instance is None:
                obj = object.__new__(cls)
                cls.__instance = obj
            return cls.__instance
        def __init__(self,name,age):
            self.name = name
            self.age = age
    a = B('ads',18)
    b = B('egon',20)
    print(a)
    print(b)
    #打印的都是同一个内存地址
    print(a.name)
    print(b.name)
    单例模式

    7,__getitem__      __setitem__     __delitem__

    class Foo:
        def __init__(self,name):
            self.name=name
    
        def __getitem__(self,item):
            return  self.__dict__[item]
    
        def __setitem__(self, key, value):
            self.__dict__[key]=value
    
        def __delitem__(self, key):
            print('del obj[key]时,我执行')
            self.__dict__.pop(key)
    
    f = Foo('alex')
    # f.name = ...
    print(f['name'])     # f.__getitem__('name')
    f['age']  = 18      # 赋值
    print(f.age)        # 自带的语法
    print(f['age'])
    f['age']  = 80        # 修改
    print(f['age'])      # 通过实现__getitem__得到的
    del f['age']        # 删除
    View Code

    8,__str__

    print(obj) 的结果 是 obj.__str__()的结果,print替你将数据类型转化成字符串打印出来。

    str(obj) 的结果 也是 obj.__str__()的结果。

    '%s' %obj 的结果 也是 obj.__str__()的结果。

    class List:
        def __init__(self,*args):
            self.l = list(args)
        def __str__(self):
            return '[%s]'%(','.join([str(i) for i in self.l]))
    l1 = List(1,2,3,4,5)
    print(l1)        #--> l1.__str__()
    #print替你将数据类型转化成字符串打印出来
    print(str(l1))
    print('%s'%l1)
    #以上三种方式打印的内容相同
    View Code

    9,__repr__

    repr(obj) 的结果和obj.__repr__()是一样的

    '%r' %(obj)的结果和obj.__repr__()是一样的

    class Teacher:
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def __str__(self):
            return "Teacher's object %s"%self.name
        def __repr__(self):
            return 'repr function %s'%self.name
    a = Teacher('alex',80)
    b = Teacher('egon',80)
    print(a)
    print(b)
    print(repr(a))   # 相当于print(a.__repr__())
    print('%r'%a)
    print(str(a))   # 打印str函数的返回值
    View Code

    10,,__str__ 和__repr__的区别

    当需要使用__str__的场景时找不到 __str__就找__repr__

    当需要使用__repr__的场景时找不到__repr__的时候就找父类的repr

    11,__format__

    class A:
        def __init__(self,name,school,addr):
            self.name = name
            self.school = school
            self.addr = addr
        def __format__(self,format_spec):
            return format_spec.format(obj=self)
    
    a = A('大表哥','oldboy','沙河')
    format_spec = '{obj.name}-{obj.addr}-{obj.school}'
    print(format(a,format_spec))
    View Code
  • 相关阅读:
    Log4Net使用指南
    Log4net 写文件日志与数据库日志
    JSON-Schema 最科学的表单验证模式
    番茄时间工作法
    css 温故而知新 1px的问题
    $.ajax 温故而知新坑
    H5中滚动卡顿的问题
    横向思维
    Wd 西部数据
    使用AlloyLever来搞定开发调试发布,错误监控上报,用户问题定位
  • 原文地址:https://www.cnblogs.com/leiwei123/p/8884196.html
Copyright © 2020-2023  润新知