python3魔法方法汇总

 

概述:

1.Python对象自带的一些被下划线包围的方法,我们称之为魔法方法,如果python对象重载了这些方法,那么我们可以某些情况下去使用它

2.魔法方法是python内置方法,不需要主动调用,存在的目的是为了给python的解释器进行调用,几乎每个魔法方法都有一个对应的内置函数,或者运算符,当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法,可以理解为重写这些python的内置函数。

 

 

__init__()

      __init__()方法,在创建一个对象时默认被调用,不需要手动调用 

      __init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#____________________________________普通_________________________________________
class Item(object):
    #用于初始化类的操作和配合__new__
    def __init__(self,name,price):
        self.name=name
        self.price=price
        print(self.name,self.price)

    def foo(self):
        print('test')

it=Item('口罩',0.5)
it.foo()


#_________________________________在init中调用其他函数,完成初始化操作_____________________________________________________
def wei(name):
    print('11111111111111')
    return name+'0000000'

class chen():

    def __init__(self,name,age):
        self.name=name
        self.age=age
        self.test001=wei(self.name)#也可以调用不同模块的函数
        print(self.test001)
        #在init中调用类方法
        self.name_age=self.name_age()
        print(self.name_age)

    def sum_age(self):
        print('1111111111')
        return self.age*20

    def name_age(self):
        return 'testtest'

wei=chen('test',30)
print('-----------------------------------')
print(wei.sum_age())

 

__new__(cls[, …])

    在第一次遇见__init__(self[,…])方法时我们会认为对象创建时第一个调用的方法就是它,其实不是。第一次调用的方法是__new__(cls[,…])。__init__更多的是负责初始化操作,相当于一个项目中的配置文件,__new__才是真正的构造函数,创建并返回一个实例对象,如果__new__只调用了一次,就会得到一个对象。

    它的第一个参数是这个类,其他的参数是用来直接传递给__init__ 方法

class TestClass:
    def __init__(self):
        print("调用__init__")
def __new__(cls, *args, **kwargs):
     print(cls)
print("调用__new__") return object.__new__(cls)#返回当前类的实例(不返回则不会调用__init__) t = TestClass()

 

__new__ 决定是否要使用该 __init__ 方法,因为__new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则__init__ 不会被调用。

class A:
    print('11111111')

    def chen(self):
        print('22222222222')

class B(A):
    def __init__(self):
        print("调用__init__")

    def __new__(cls, *args, **kwargs):
        print("调用__new__")
        a= object.__new__(cls)#获取当前类的的实例,不会调用__init__方法
        #通过对象调用父类函数(通过继承方式调用)
        a.chen()

t = B()



class A:
    pass

class B(A):
    def __init__(self):
        print("调用__init__")
def __new__(cls, *args, **kwargs): print("调用__new__") return object.__new__(A)#返回父类的实例,不会调用__init__方法 t = B()

 

__del__(self)

      有了构造函数自然少不了析构函数。Python中__del__可以认为是析构函数了,在一个实例被销毁时它会执行。该方法是解释器自动调用的,一般情况下不重写。

class Testclass:
    def __new__(cls, *args, **kwargs):
        print("创建实例")
        return object.__new__(cls)

    def __init__(self):
        print("初始化实例")
def __del__(self): print("销毁") print("自动调用del") T = Testclass()

 

 

__str__(self)

当被 str() 调用时会执行__str__。此方法类似JAVA中的toString方法。

__str__()函数就可以帮助我们打印对象中具体的属性值,或者你想得到的东西

class A:
    def __init__(self,name):
        self.name = name

class B:
    def __init__(self,name):
        self.name = name
def __str__(self):#重写__str__方法 return self.name a = A("Tom") print(a)
b
= B("Jake") print(b)#显示对象的参数

 

__repr__()

该方法继承自object类。当创建我们用print打印对象时,会默认调用该方法得到我们关于类的信息,比如<xxxx object at 0x000000879>等,因此又称为自我描述方法。我们可以重写该方法在print的时候获取自己想要的信息,比如:

class Item:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def __repr__(self):
        return self.name + '--' + str(self.price)


it = Item('cat', 18.8)
print(it)

 

str()与repr()的区别

在python中,str()与repr()都可以使实现类型的转换,而我们最常用的是str(),什么时候repr使用?
str():将值转化为适于人阅读的字符串的形式(给人看)
repr():将值转化为供解释器读取的字符串形式(给机器看)

##_____________________________________str实例_____________________________________________
class A(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return 'name:{},age:{}'.format(self.name,self.age)


my_list = [A('张三', 8), A('李四', 9)]
print(my_list)

#__________________________________repr实例___________________________________________ class A(object): def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return f'name:{self.name},age:{self.age}' my_list = [A('张三', 8), A('李四', 9)] print(my_list)

通过简单的对⽐,我们发现,直接输出对象,调⽤的__repr__ ⽅法。
另外还需要注意的是,如果将对象放在容器中进⾏输出,调⽤的是__repr__ ⽅法。

 

__dict__属性

该属性用于查看对象的属性,返回一个字典集合。

class Item:
    def __init__(self,name,price):
        self.name=name
        self.price=price

    def foo(self):
        pass

    def bar(self):
        self.price=0.8
        print(it.__dict__)

it=Item('口罩',0.5)
print(it.__dict__)#打印字典集合
for k,v in it.__dict__.items():
    print(k,v)

it.bar()#调用bar方法

 

__doc__属性 和__name__属性

__doc__用于查看说明文档。python的说明文档接着写在类名下面就可以了。

__name__用于查看实例方法或类

class Foo(object):
    """ 描述类信息,可被自动收集 """
def func(self): '''实例方法描述''' print('11111111111') print(Foo.__doc__)# 打印类的说明文档 print(Foo.func.__doc__)# 打印类方法描述

print(Foo.func.__name__)#打印实例方法名称

 

__call__()

Python中有一个有趣的语法,只要定义类型的时候,实现__call__函数,这个类型就成为可调用的。
换句话说,直接通过对象调用__call__函数 (相当于 重载了括号运算符)

class Cog(object):
    #__init__创建完对象后会自动被调用(用于初始化类)
    def __init__(self):
        print("----init方法-----")
#__call__作用是使实例能够像函数一样被调用,同时不影响实例本身的生命周期(直接对象()调用) def __call__(self): return '调用__call__' xtq = Cog() print(xtq())#直接使用对象()调用__call__

 

 

相关连接:

https://www.cnblogs.com/shenxiaolin/p/9307496.html .....................................Python 中的__new__和__init__的区别

 

posted on 2021-01-27 18:27  chen_2987  阅读(232)  评论(0)    收藏  举报

导航