文中第一部分为清晰表达双下划线“_ _”,中间加了一个空格。请注意实际代码编写过程中写作“__”,中间无空格!
文章目录
一、python中的"_ xxx"、“_ _ xxx”、“_ _ xxx_ _”
默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类public,private等关键词来修饰成员函数和成员变量。其实,Python并没有真正的私有化支持,但可用下划线得到伪私有。 尽量避免定义以下划线开头的变量!
-
_xxx 单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问;*不能用’ from module import '导入。
-
_ _xxx 类中的私有变量/方法名 (Python的函数也是对象,所以成员方法称为成员变量也行得通。)," 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
-
_ _ 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