学过python的人都知道,python有很多__开头和__结尾的内建函数。每个函数都有着不同的功能和意义。今天就主要来讲解一下__init__()__call__()__str__()和__all__的用法
__init__()这个函数在python中应该是最常见也是最常用的函数了,从字面意思来看像是初始化函数。这个函数实际上是python中类的构造函数。如果大家学过C#或Java的话应该都知道无论是在java还是在C#中,当我们创建一个类的时候,一般都会在类中声明一个以类的名字命名的且无返回值的函数,那么这个函数就是类的构造函数。python中的类也是一样有着自己的构造函数,不同的是这个构造函数不是以类的名称命名而是固定的__init__()。那么这个函数在什么时候调用又有什么用途呢?接下来我们看个例子
C#示例
public class Test{
public Test(){
Console.WriteLine("我是Test类的构造函数,我在类被示例化时调用");
}
}
new Test()//此时会调用构造函数并输出“我是Test类的构造函数,我在类被示例化时调用”
python示例
class Test():
def __init__(self):
print("我是Test的构造函数,我将在类被实例化时调用")
t = Test()#此时会输出“我是Test的构造函数,我将在类被实例化时调用”
相信看完上面的例子,已经有了答案,构造函数将会在类被实例化时调用,也就是说不管在哪里只要遇到Test(),那么类的构造函数就会被调用。
因为类在被初始化时会调用构造函数,所以一般情况下,构造函数会用于初始化一些类的基本数据所用。
这个函数也是python中比较常见的函数,其主要用来返回一个对象的描述信息,比如一个类有name,age,address等属性,那么就可以通过定义__str__()函数来返回这个类的描述信息。用法就是直接使用这个类的对象即可,一般用于打印输出等。
代码实例
class Test():
def __init__(self,name,age,addr):
self.name = name
self.age = age
self.address = addr
def __str__(self):
print("我可以输出对象的描述信息")
return '我的名字是:%s,我的年龄是:%s,我的地址:%s' % (self.name,self,age,self.address)
#调用
t = Test('alvin',28,'hangzhoushi')
print(t)
#输出结果:
"我可以输出对象的描述信息"
"我的名字是:alvin,我的年龄是:28,我的地址:hangzhoushi"
这个方法是python中的一个特殊方法,虽然不是很常见但有时候也会用得到。通常情况下我们在调用一个函数的时候,都是通过函数名()的形式来调用,如果调用的是类中的函数则是由类的对象名称.函数名()进行调用,这类函数被称为可调用对象。所有的函数都是可调用对象,同样一个类的实例也可以变成一个可调用对象。只需要实现这个特殊的函数__call__()即可通过类的实例名()的形式来使用。
代码示例
class Test():
def __call__(self):
print('我是一个特殊的方法,可以让类变成可调用对象')
#调用方式1
t = Test()
t()
#调用方式2
Test()()
#输出结果
'我是一个特殊的方法,可以让类变成可调用对象'
上面讲到的三个函数都是在类的内部定义实现的是类级别的,接下来要讲的这个不是一个函数而是一个列表类型的属性,它也不是定义在类的内部,而是模块级别的,定义在模块中的。
当我们导入一个模块的时候,有如下几种方式:
import xxx
from xxx import *
from xxx import x,xx
有时候我们定义好了一个模块,有的方法或属性只想在本模块内部使用不想让外部导入,这个时候该怎么办呢?__all__就派上用场了。只需要在模块中定义一个名为__all__的列表,然后把要开放的对象即可以被外部导入使用的对象,把对象名以字符串的形式添加到该列表中即可,这样外部就只能导入和使用在列表中定义过的对象,其它的是不能导入和使用的
示例代码
#test.py模块
__all__ = ["test1","name"]
def test1():
print("我是test1函数")
name = '我们是模块名'
def test2():
print("我是test2函数,是内部函数不想让外部使用")
如上示例,不管外部是通过 import test还是通过from test import *来导入,那么可使用的对象只有test1函数和name属性,而test2是不能被外部导入和使用的。