Python中的魔法函数(__init__()和__ str__())

__init__属于魔法函数的一种,后面介绍了其他的魔法函数:__ str__()__ new__()__ unicode__()__ call__()__ len__()__repr__()等等。本文只讲解比较常见的两个。

一、什么是魔法函数?

所谓魔法函数,是Python的一种高级语法,允许你在类中自定义函数(函数名格式一般为__xx__),并绑定到类的特殊方法中。比如在类A中自定义__str__()函数,则在调用str(A())时,会自动调用__str__()函数,并返回相应的结果。在我们平时的使用中,可能经常使用__init__函数(构造函数)__del__函数(析构函数),其实这也是魔法函数的一种。

  1. Python中以双下划线(__xx__)开始和结束的函数(不可自己定义)为魔法函数。

  2. 调用类实例化的对象的方法时自动调用魔法函数。

  3. 在自己定义的类中,可以实现之前的内置函数。

二、魔法函数有什么作用?

魔法函数可以为我们写的类增加一些额外的功能,方便使用者理解。

举一个简单的例子,我们定义一个“人”的类people,当中有属性name、age和sex。我们需要使用sorted函数对一个people的数组进行排序,排序规则是按照name和age同时排序,即name不同时比较name,相同时比较age。

由于people类本身不具有比较功能,所以需要自定义,你可以这么定义people类:

class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return self.name + ":" + str(self.age)

    def __lt__(self, other):
        return self.name < other.name if self.name != other.name else self.age < other.age

if __name__=="__main__":
    print("\t".join([str(item) for item in sorted([People("abc", 18),People("abe", 19), People("abe", 12), People("abc", 17)])]))

我们看一下运行结果:

abc:17	abc:18	abe:12	abe:19

上个例子中的__lt__函数即less than函数,即当比较两个People实例时自动调用。

三、常见的魔法函数

  1. __ init__()

所有类的超类object,有一个默认包含pass的__ init __()实现,这个函数会在对象初始化的时候调用,我们可以选择实现,也可以选择不实现,一般建议是实现的,不实现对象属性就不会被初始化。

__init__() 方法可以包含多个参数,但必须包含一个名为 self 的参数,且必须作为第一个参数。

也就是说,类的构造方法最少也要有一个 self 参数,仅包含 self 参数的 __init__() 构造方法,又称为类的默认构造方法。例如,仍以上类为例,添加构造方法的代码如下所示:

class The_First_Demo:
    # 构造方法
    def __init__(self):
        print('类的使用方法')

if __name__=='__main__':
    result=The_First_Demo()

输出结果:

类的使用方法

在创建 result 这个对象时,隐式调用了我们手动创建的 __init__() 构造方法。

不仅如此,在 __init__() 构造方法中,除了 self 参数外,还可以自定义一些参数,参数之间使用逗号“,”进行分割。例如,下面的代码在创建 __init__() 方法时,额外指定了 2 个参数:

class C_Language:
    def __init__(self,name,add):
        print(name,"的网址为:",add)

#创建 add 对象,并传递参数给构造函数
add = C_Language("C语言中文网","http://c.biancheng.net")

输出结果:

C语言中文网 的网址为: http://c.biancheng.net

可以看到,虽然构造方法中有 self、name、add 3 个参数,但实际需要传参的仅有 name 和 add,也就是说,self 不需要手动传递参数。

  1. __ str__()

直接打印对象的实现方法,__ str__是被print函数调用的。打印一个实例化对象时,打印的其实时一个对象的地址。而通过__str__()函数就可以帮助我们打印对象中具体的属性值,或者你想得到的东西。

在Python中调用print()打印实例化对象时会调用__str__()。如果__str__()中有返回值,就会打印其中的返回值。

class Detective_books:
    def __init__(self,names='希腊棺材之谜',authors='埃勒里-奎因'):
        self.name=names
        self.author=authors

    #返回一个对象的描述信息
    def __str__(self):
        return "名字是:%s ,作者是:%s"%(self.name,self.author)

result=Detective_books('希腊棺材之谜','埃勒里-奎因')
print(result)

输出结果:

名字是:希腊棺材之谜 ,作者是:埃勒里-奎因

总结:

当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据。__str__方法需要返回一个字符串,当做这个对象的描写。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旅途中的宽~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值