Python中 _xx、__xx、__xx__ 的区别

在Python中,一般情况下我们常见的变量大都属于公共变量,比如 xx = 13 中的 xx 就是一个公共变量,但有时候我们也会在一些Python代码中看到一些加下划线的变量/方法,比如 _xx__xx__xx__,我们今天就来学习下这几个的区别。

前面有1个下划线 _xx

如果在类中的变量/方法前面加 1 个下划线,那么这样的就称为保护变量/方法。

class A:
    age1 = 10
    _age2 = 20

    def method_a1(self):
        print("类内部调用公共变量:{}".format(self.age1))

    def _method_a2(self):
        print("类内部调用保护变量:{}".format(self._age2))


class B(A):  # B是A的子类
    def method_b(self):
        print("子类调用父类的公共变量:{}".format(self.age1))
        print("子类调用父类的保护变量:{}".format(self._age2))


a = A()
print(a._age2)  # 通过 实例对象.保护变量 调用
print(A._age2)  # 通过 类对象.保护变量 调用

b = B()
b.method_b()
b.method_a1()  # 子类的实例对象调用父类中的公共方法
b._method_a2()  # 子类的实例对象调用父类中受保护的方法

执行结果如下:

20
20
子类调用父类的公共变量:10
子类调用父类的保护变量:20
类内部调用公共变量:10
类内部调用保护变量:20

从上面结果中可发现,当设置为保护变量后,我们在类内部和子类也是能够访问到这些变量的,总的来说和公共变量没有太大差别。我们设置为保护变量,一般是不希望其在类的外部被使用或直接访问。

需要注意一点,保护变量不能通过 from module import * 方式导入,但这并不意味我们在外部就无法访问到保护变量了。

  • 如果是类内部的保护变量,我们可通过 实例对象.变量名类名.变量名 进行调用
  • 如果是类外部的保护变量,我们可先通过 import 模块名 导入模块,然后再通过 模块名.变量名进行调用

前面有2个下划线 __xx

如果在类中的变量/方法前面加 2 个下划线,那么这样的就称为私有变量/方法,意味着只能在类内部能够访问到这些变量/方法,其子类也不能访问。

然而在Python中,即使设置了私有变量/方法,如果我们真想要在外部访问,其实也是可以实现的,具体可以通过 _类名__私有变量/方法 来进行调用。

class A:
    age1 = 10
    _age2 = 20
    __age3 = 30

    def method_a1(self):
        print("类内部调用公共变量:{}".format(self.age1))

    def _method_a2(self):
        print("类内部调用保护变量:{}".format(self._age2))

    def __method_a3(self):
        print("类内部调用私有变量:{}".format(self.__age3))


class B(A):  # B是A的子类
    def method_b(self):
        print("子类调用父类的公共变量:{}".format(self.age1))
        print("子类调用父类的保护变量:{}".format(self._age2))
        # print("子类调用父类的私有变量:{}".format(self.__age3))  # 会报错,不能这样调用
        print("子类调用父类的私有变量:{}".format(self._A__age3))


a = A()
# print(a.__age3)  # 会报错,不能这样调用
print(a._A__age3)  # 通过 实例对象._类名__私有变量 调用
# print(A.__age3)  # 会报错,不能这样调用
print(A._A__age3)  # 通过 类对象._类名__私有变量 调用

b = B()
b.method_b()
b.method_a1()  # 子类的实例对象调用父类中的公共方法
b._method_a2()  # 子类的实例对象调用父类中受保护的方法
# b.__method_a3()  # 会报错,不能这样调用
b._A__method_a3()  # 子类的实例对象调用父类中私有的方法

执行结果如下:

30
30
子类调用父类的公共变量:10
子类调用父类的保护变量:20
子类调用父类的私有变量:30
类内部调用公共变量:10
类内部调用保护变量:20
类内部调用私有变量:30

从上面可以看到,无论是保护变量还是私有变量,我们都可以在外部进行访问,Python中并不能真正控制变量/方法的访问权限。

  • 如果是类内部的私有变量,我们可通过 实例对象._类名__私有变量类名._类名__私有变量 进行调用
  • 如果是类外部的私有变量,我们可先通过 import 模块名 导入模块,然后再通过 模块名.__私有变量进行调用

前后都有2个下划线 __xx__

在Python中,类似 __xx____xx__() 这种前后都有 2 个下划线的变量或方法,通常是Python中内置的特殊变量属性或方法的标识,我们应尽量避免使用该方式来自定义变量或方法。

内置方法

一般情况下,Python代码执行时会自动调用到这些内置属性或方法,比如当一个类对象实例化时,就会自动调用 __new__()__init__() 来完成构造和初始化。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容