zoukankan      html  css  js  c++  java
  • Python 基础第二十四天(重要的内置方法)

    今日重要内容:

    内置方法

    1.__str__

    2.__repr__

    3.__format__

    4.__call__

    5.__eq__

    6.__del__ (析构方法)

    7.__new__

    8.item 系列

    共同:一下将的内置方法,object类中已经内置了,如果你不重构,则按照object类中的规则显示

    1.__str__ 

    2.__repr__

    __str__和__repr__都是用于重构显示类中需要输出的内容,否则默认只是显示内存地址.

    例: __str__

    class List:
        def __init__(self,*args):
            self.l = list(args)
        def __str__(self):
            return '[%s]' %(','.join([str(i) for i in self.l]))
    
    l = List(1,2,4,5,3)
    print(l)
    l.__str__()
    print(l.__str__())
    print(str(l))
    print('%s'%l)
    
    结果:
    [1,2,4,5,3]
    [1,2,4,5,3]
    [1,2,4,5,3]
    [1,2,4,5,3]

    例:__str__,__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',30)
    b = Teacher('egon',45)
    print(a)
    print(b)
    
    def repr(obj):
        return obj.__repr__()
    print(repr(a))
    print(a.__repr__())
    print('%r'%a)
    print(str(a))
    
    结果:
    Teacher's object alex 
    Teacher's object egon 
    repr function alex
    repr function alex
    repr function alex
    Teacher's object alex 

    总结:

    1.__str__:,,,,,__repr__:

    如果代码注销掉自定义的__str__和__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',30)
    b = Teacher('egon',45)
    print(a.__str__())
    print(a)
    print(b)
    
    def repr(obj):
        return obj.__repr__()
    print(repr(a))
    print(a.__repr__())
    print('%r'%a)
    print(str(a))
    
    结果:
    <__main__.Teacher object at 0x00000000027CA780>
    <__main__.Teacher object at 0x00000000027CA780>
    <__main__.Teacher object at 0x00000000027CA7F0>
    <__main__.Teacher object at 0x00000000027CA780>
    <__main__.Teacher object at 0x00000000027CA780>
    <__main__.Teacher object at 0x00000000027CA780>
    <__main__.Teacher object at 0x00000000027CA780>

    2.__str__:,,,,,__repr__:

    如果注销掉__str__方法,仍然可以打印出我们想要的内容.说明__repr__可以代替__str__的功能

    例:

    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',30)
    b = Teacher('egon',45)
    print(a.__str__())
    print(a)
    print(b)
    
    def repr(obj):
        return obj.__repr__()
    print(repr(a))
    print(a.__repr__())
    print('%r'%a)
    print(str(a))
    结果
    repr function alex
    repr function alex
    repr function egon
    repr function alex
    repr function alex
    repr function alex
    repr function alex

    __str__和__repr__的用法:

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

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

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

    总结:   #obj 表示类对象

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

    str() 的结果是依赖 obj.__str__()            
    print(obj) 的结果是依赖 obj.__str__()
    %s 的结果是依赖 obj.__str__() # 语法糖
    repr() 的结果是依赖 obj.__repr__()
    %r 的结果是依赖 obj.__repr__()

    repr是str的备胎

    3.__format__  类内的格式化输出  与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))  #固定格式输出
    
    结果:
    大表哥-沙河-oldboy

    4. __call__

    用途:类内设置__call__ 为了能够让对象使用对象名()调用__call__方法

    例:

    class Teacher():  #python3中表示继承object
        def __call__(self):
            print(123)
        def call(self):print(345)
    
    t = Teacher()
    t.call()
    t()
    
    结果:
    345
    123

     一个对象是否可调用 完全取决于这个对象对应的类是否实现了__call__

    print(callable(Teacher))
    print(callable(t))

    5.__eq__()  与 == 相关联

    作用:用来确认 类内相等的条件

    例:

    class A:
        def __eq__(self, other):
            return True
    
    a = A()
    a.name = 'alex'
    b = A()
    b.name = 'egon'
    print(a)
    print(b)
    print(a == b)
    
    结果:
    <__main__.A object at 0x00000000027BA2B0>
    <__main__.A object at 0x00000000027BA748>
    True

    结论:

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

    6.__del__  析构方法

    作用:在删除一个对象的时候做一些收尾工作

    class A:
        def __init__(self):
            self.f = open('文件','w')
        def __del__(self):   #默认在类外执行del 删除 对象a的时候先执行__del__
            self.f.close()
            print('执行我了')
    a = A()
    del a
    print(a)
    print('111')
    
    结果:
    执行我了
    Traceback (most recent call last):
      File "F:/Python-script-2/s11-day24/练习.py", line 82, in <module>
        print(a)
    NameError: name 'a' is not defined

    结论:

    __del__这个内置方法是自动执行的,不需要外部调用.所以称作析构方法.

    7.__new__ 构造方法

    作用:在实例化的时候优先执行__new__进行内存空间的构造,在__new__方法执行后,才会执行__init__赋值操作.

    __new__处还有一个经典的设计模式叫做单例模式

    单例模式就是创建不同的实例化对象,其实都是只有一个内存空间.

    普通模式下,一个实例化就是一个内存空间,每个内存空间都是不同.

    例:通过例子了解单例模式

    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
        def func(self):
            print(self.name)
    
    a = B('alex',45)
    b = B('agon',34)
    print(a)
    print(b)
    print(a.name)
    print(b.name)
    结果:

    <__main__.B object at 0x0000000001E8A7B8>
    <__main__.B object at 0x0000000001E8A7B8>
    agon
    agon

    8.item系列  #通过对象对item方法下的属性进行取值,赋值,修改和删除

    __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')
    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']
    print(f.age)
    
    结果:
    18
    18
    80
    del obj[key]时,我执行
      File "F:/Python-script-2/s11-day24/练习.py", line 127, in <module>
        print(f.age)  
    AttributeError: 'Foo' object has no attribute 'age'
  • 相关阅读:
    windows 创建python独立开发环境
    sql多列排序
    mysql 导入sql脚本中文乱码问题
    廖雪峰Python教学课后作业---datetime
    poj 1004:Financial Management(水题,求平均数)
    【POJ水题完成表】
    poj 1003:Hangover(水题,数学模拟)
    ytu 2558: 游起来吧!超妹!(水题,趣味数学题)
    poj 1005:I Think I Need a Houseboat(水题,模拟)
    hdu 2393:Higher Math(计算几何,水题)
  • 原文地址:https://www.cnblogs.com/tom2ling/p/8885727.html
Copyright © 2011-2022 走看看