python中的_xx、_ _xx、_ _xx_ _和__init__()、__new__()、__str__()、__del__()、__call__()等方法详解

文中第一部分为清晰表达双下划线“_ _”,中间加了一个空格。请注意实际代码编写过程中写作“__”,中间无空格!


一、python中的"_ xxx"、“_ _ xxx”、“_ _ xxx_ _”

默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类public,private等关键词来修饰成员函数和成员变量。其实,Python并没有真正的私有化支持,但可用下划线得到伪私有。 尽量避免定义以下划线开头的变量!

  1. _xxx 单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问;*不能用’ from module import '导入

  2. _ _xxx 类中的私有变量/方法名 (Python的函数也是对象,所以成员方法称为成员变量也行得通。)," 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据

  3. _ _ xxx_ _ 系统定义名字,前后均有一个“双下划线”, 代表python里特殊方法专用的标识,如 “_ _init _ _()”代表类的构造函数


二、python中的__init__、__ new__、__ str__、__ del__、__call__等方法

1. __init__方法和__new__方法

  • __init__方法是python中初始化的方法,也称构造方法。但是它与其他语言中的构造方法不同,它只进行初始化。
  • __new__方法是创建对象的方法。

__init__方法示例:

class Cat(object):
   def __init__(self):
       print("这是__init__方法")

创建对象调用:

cat=Cat()  #输出结果:这是__init__方法

__new__方法示例:

class Cat(object):
    def __init__(self):
        print("这是__init__方法")
    def __new__(cls):
        print("这是__new__方法")

创建对象调用:

cat=Cat()	#输出结果:这是__new__方法

现在发现函数并没有执行__init__方法,这是因为object类是所有类的基类,在创建对象时都要调用基类中的__new__方法,这里相当于把父类的__new__方法进行了复写。要想它继续执行__init__方法,就要返回父类__new__方法创建出来对象的引用。


下面进行修改:

class Cat(object):
    def __init__(self):
        print("这是__init__方法")
    def __new__(cls):
        print("这是__new__方法")
        return object.__new__(cls)

创建对象继续调用:

cat=Cat()
输出结果:这是__new__方法
        这是__init__方法

2 __str__方法和__del__方法

__str__获取对象的描述信息时自动调用,也即用print(对象名)时输出__str__的信息。

class Cat(object):
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return "这是一只%s"%self.name
cat1=Cat("白猫")
print(cat1)
cat2=Cat("黑猫")
print(cat2)
输出结果:
这是一只白猫
这是一只黑猫

del删除时会调用__del__方法,__del__方法在程序结束和对象死掉的时候会自动执行。 del 用于销毁 Python 对象,即在任何 Python 对象将要被系统回收之时,系统都会自动调用该对象的 __del__方法。

class Cat(object):
    def __init__(self,name):
        self.name=name
    def __del__(self):
        print("执行__del__方法")

cat1=Cat("白猫")
cat2=cat1
del cat1
# del cat2
print("======程序结束======")

打印结果:

======程序结束======
执行__del__方法

根据打印结果可以看到 删除一个对象cat1那么创建的对象只有在程序完全结束的时候才调用__del__方法进行删除


3 __call__方法

__call__方法的作用是将创建的实例对象可以当方法用,也就是能够给创建的实例对象穿参数。

class Cat(object):
    def __call__(self,temp):
        return temp**2
cat1=Cat()
print(cat1(2))
输出结果:4

这个例子可以 看出将对象作为了方法来给它传参数进行计算。换句话,以后要想将对象作为方法,那么__call__方法就能帮你实现。


reference:
https://www.cnblogs.com/ybf-yyj/p/9026588.html
https://blog.csdn.net/gwpjiayou/article/details/103623787?ops_request_misc=&request_id=&biz_id=102&utm_term=python%E4%B8%AD__init__%E7%AD%89%E6%96%B9%E6%B3%95&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-4-103623787.142v100pc_search_result_base2&spm=1018.2226.3001.4187

  • 29
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值