python基础语言之__init__()__call__()__str__()和__all__的用法及讲解

学过python的人都知道,python有很多__开头和__结尾的内建函数。每个函数都有着不同的功能和意义。今天就主要来讲解一下__init__()__call__()__str__()和__all__的用法

__init__()

__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(),那么类的构造函数就会被调用。

因为类在被初始化时会调用构造函数,所以一般情况下,构造函数会用于初始化一些类的基本数据所用。

__str__()

这个函数也是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"

__call__()

这个方法是python中的一个特殊方法,虽然不是很常见但有时候也会用得到。通常情况下我们在调用一个函数的时候,都是通过函数名()的形式来调用,如果调用的是类中的函数则是由类的对象名称.函数名()进行调用,这类函数被称为可调用对象。所有的函数都是可调用对象,同样一个类的实例也可以变成一个可调用对象。只需要实现这个特殊的函数__call__()即可通过类的实例名()的形式来使用。

代码示例

class Test():
    def __call__(self):
        print('我是一个特殊的方法,可以让类变成可调用对象')

#调用方式1
t = Test()
t()

#调用方式2
Test()()

#输出结果
'我是一个特殊的方法,可以让类变成可调用对象'

__all__

上面讲到的三个函数都是在类的内部定义实现的是类级别的,接下来要讲的这个不是一个函数而是一个列表类型的属性,它也不是定义在类的内部,而是模块级别的,定义在模块中的。

当我们导入一个模块的时候,有如下几种方式:

import xxx
from xxx import *
from xxx import x,xx
  1. 将整个xxx模块导入,然后用模块名xxx.xx去使用模块中的对象
  2. 将模块xxx中所有的对象全部导入,然后直接使用,这样的缺点就是一旦后面导入的模块跟前面导入的模块中有重名的对象,那么前面导入的将会被覆盖掉
  3. 只导入模块xxx中的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是不能被外部导入和使用的。

你可能感兴趣的:(技术,人生苦短,我用python,python,模块导入,__init__,__str__,__call__)