__init__
属于魔法函数的一种,后面介绍了其他的魔法函数:__ str__()
、__ new__()
、__ unicode__()
、__ call__()
、__ len__()
、__repr__()
等等。本文只讲解比较常见的两个。
所谓魔法函数,是Python的一种高级语法,允许你在类中自定义函数(函数名格式一般为__xx__
),并绑定到类的特殊方法中。比如在类A中自定义__str__()
函数,则在调用str(A())时,会自动调用__str__()
函数,并返回相应的结果。在我们平时的使用中,可能经常使用__init__函数(构造函数)
和__del__函数(析构函数)
,其实这也是魔法函数的一种。
Python中以双下划线(__xx__
)开始和结束的函数(不可自己定义)为魔法函数。
调用类实例化的对象的方法时自动调用魔法函数。
在自己定义的类中,可以实现之前的内置函数。
魔法函数可以为我们写的类增加一些额外的功能,方便使用者理解。
举一个简单的例子,我们定义一个“人”的类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实例时自动调用。
__ 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 不需要手动传递参数。
__ 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__
方法需要返回一个字符串,当做这个对象的描写。