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'
原文地址:https://www.cnblogs.com/tom2ling/p/8885727.html