python类的特殊方法-自动调用的原理和实现这些你都知道了吗?

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

本文章来自腾讯云 作者:计算机与AI

想要学习Python?有问题得不到第一时间解决?来看看这里“1039649593”满足你的需求,资料都已经上传至文件中,可以自行下载!还有海量最新2020python学习资料。
点击查看

在这里插入图片描述
特殊方法(特殊成员):这类方法名字特殊,有特殊用途,会自动调用。

因为特殊又会自动调用,大家也叫做魔术方法(魔法方法)。

特殊方法组成:固定命名-开头结尾都是双下划线。

下面说一下特殊方法及自动调用方式

1、init():一般用来初始化类的参数,大家习惯叫做【构造方法】

使用情况:最多使用,一般的类都会使用

自动调用方式:生成对象(实例化类)的时候自动调用。如:类()

class Person:

    def __init__(self, name, age):
        print('执行__init__方法')

p1 = Person('jack', 18)  # 返回:执行__init__方法  解读:实例化只执行__init__方法

2、call():告诉你类对象也可以当作函数来调用,一般叫【函数式调用】。

使用情况:使用较少,装饰器用的多。

自动调用方式:将对象当做函数时调用。如:对象()、类()()、装饰器

备注:如果某个类中写了这个方法,类的实例就变成可调用对象,可以像函数那样去调用。

class Person:

    def __init__(self):
        print('执行__init__方法')

    def __call__(self, *args, **kwargs):
        print('执行__call__方法')

p1 = Person()  # 返回:执行__init__方法  解读:实例化只执行__init__方法
p1()  # 返回:执行__call__方法  解读:对象(当作函数)加小括号,执行__call__方法
class Outer:

    def __init__(self,fun):  # 函数名作为参数
        self.fun = fun

    def __call__(self, *args, **kwargs):  # 1、__call__自动调用和返回内部函数
        print('执行函数前')
        result = self.fun(*args, **kwargs)  # 2、内部函数引用外部函数变量
        print('执行函数后')
        return result

@Outer         # 装饰器使用
def func(a):
    print('普通函数')
    return a

f = func(3)
print(f)  # 返回:3

3、get():类中实现这个方法叫做描述器(setdelete

使用情况:使用较少,装饰器用的多

自动调用方式:类作为另一个类的属性调用、装饰器

class A:

    def __init__(self):
        print('执行__init__方法')

    def __get__(self, instance, owner):
        print('执行__get__方法')

class B:
    a = A()

b = B()  # 返回:执行__init__方法  解读:实例化只执行__init__方法,不调用 __get__方法
c = b.a  # 返回:执行__get__方法  解读:A类作为B类的属性调用时,执行__get__方法
class Outer:

    def __init__(self,fun):
        self.fun = fun

    def __get__(self, instance, owner):
        def inner(*args, **kwargs):
            print('执行函数前')
            result = self.fun(instance, *args, **kwargs)
            print('执行函数后')
            return result
        return inner

class A:

    @Outer  # 装饰器使用
    def func(self, a):
        return a
a = A()
print(a.func(3))

4、中括号取值

使用情况:基本不用我们自己写

getitem(item):list[1]、list[1:2:2] 切片或索引 自动执行

setitem(item):list[1]=‘123’ 赋值 自动执行

delitem(item):del list[1] 删除值 自动执行

5、可迭代对象

使用情况:基本不用我们自己写

iter():可迭代对象,for循环时 自动执行

如果类中有__iter__方法,就是可迭代对象

对象.iter()的返回值是迭代器

6、其他很多很多

使用情况:基本不用我们自己写

str() :print(对象) 自动执行

dict():类名.dict,自动调用,对象中封装的所有成员通过字典形式返回

doc():类名.doc 时,自动调用,返回类都注释信息

len():使用len()函数时,自动调用

add():使用加号时,自动调用

还有很多很多,是不需要我们自己去写的,我们只知道,这类特殊方法是通过某种方式自动调用执行的就行了。

当然,如果你自己写的某个类中,希望以这样的方式运行,那你就自己去写对应都特殊函数就可以了。

比如咱们打印字符串对象 print(‘hello world’) 返回值是hello world;如果你想在你写都类中,打印类对象时,显示【这是我自己写的类】,那你就在你自己的类中写一个__str__() 函数

class Person:

    def __str__(self):
        return '这是我自己写的类'

p = Person()
print(p)  # 返回:这是我自己写的类

7、汇总参考(看看便于我们理解特殊方法)

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值