python 变量前的 单下划线 双下划线 前后双下划线

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))

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangvalue

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值