1.单下划线
变量前的单下划线表示表面上私有
但是其实这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
# *===================================*
# -*- coding: utf-8 -*-
# * Time : 2019-06-25 11:47
# * Author : zhangsf
# *===================================*
class convertstrtoint:
_name = "_zhangvalue"
__name = "__zhangvalue"
print(convertstrtoint._name)
print(convertstrtoint.__name)
此时打印输出的时候会报错
此时所出现的问题就是说明在类中找不到属性 __name
2.双下划线
变量前的单下划线表示真正的私有,实际上的私有,只有内部可以访问,外部不能访问
但是有窍门,可以在类里面增加get_name和set_name这样的方法来突破限制,而且还能在方法里做验证
# *===================================*
# -*- coding: utf-8 -*-
# * Time : 2019-06-25 11:47
# * Author : zhangsf
# *===================================*
class convertstrtoint:
_name = "_zhangvalue"
__name = "__zhangvalue"
def get_name(self):
return self.__name
def set__name(self, s):
self.__name = s
print(convertstrtoint._name)
# print(convertstrtoint.__name)
ttt = convertstrtoint()
print(ttt.get_name())
s = "zhangvalue_s"
ttt.set__name(s)
print(ttt.get_name())
在调用类convertstrtoint中的get_name()方法去访问__name
并且通过set__name 方法重新赋值__name
3.前后双下划线
魔术方法(magic method)是特殊方法的昵称,在Python中的特殊方法,一般都是使用诸如__xxx__
(前后两个下划线,中间是方法名)的命名方式,在书里有个名词也可以形容它,比如__getitem__
,叫做“双下—getitem” (dunnder-getitem)
在Python中,要拿到一个集合的某个元素,可以使用对应的引索进行取值,比如list[key],这背后利用的是__getitem__方法,为了拿到my_list[key]的值,解释器实际上会调用my_list.__getitem__(key)。
Python也是面向对象编程语言,对于求一个集合的长度使用len(list)而不是list.len()会感觉有点奇怪,背后就是特殊方法的作用,调用了list.__len__()方法,和面向对象完全符合,而且还起到简化的作用,变得更加通俗易懂。
(如:init):名称前后的双下划线是一种magic method,对Python系统来说,这将确保不会与用户自定义的名称冲突。通常,你将会覆写这些方法,并在里面实现你所需要的功能,以便Python调用它们。例如,当定义一个类时,你经常会覆写“init”方法
# *===================================*
# -*- coding: utf-8 -*-
# * Time : 2019-06-25 12:10
# * Author : zhangsf
# *===================================*
class Test:
def __init__(self): # 初始化(构造函数)
print("1 调用 __init__ 初始化(构造函数)")
self._number = 33
def __len__(self): # 用len取长度的特殊方法
print("2 调用 __len__ 取长度的特殊方法")
return self._number
test = Test()
print(len(test))