Python中_x,__x和__x__的区别

接下来本人就:Python中 _x, __ x 和 __ x __ 之间的区别与大家分享一下。

我们定义一个类:(不难,望读者细心阅之)

class Student():  # 类名规定:每个单词首字母大写

  def __init__(self, name, age):  # 初始化
      self.name = name
      self.age= age

  def get_age(self):
      return self._age()

  def _name(self):
      pass   # 此时 _name为 类 Student的私有方法

上述代码中出现了 __ init__ 和 _name 两个方法

  • __ init__是一个Python的魔术方法,它是内建的方法,这个方法负责初始化Python类的实例,还有很多魔术方法,比如__len__、__new__等等。
  • _name是一个私有的方法,Python 在规范中说明了私有方法或私有变量以单个 _ 开头。

为了解释__x,我们不妨再定义一个继承类:(不难,望读者细心阅之)

class StudentA():
  def __init__(self, name):
    self.__name = "studenta_name"

class StudentB():
  def __init__(self, name):
    self.__name = "studentb_name"

class StudentC(StudentA, StudentB):   # 多继承
  def __init__(self, name):
    StudentA.__init__(self, name)
    StudentB.__init__(self, name)
    self.__name = name

c = StudentC("studentc_name")
print(c.__dict__)  # {'_StudentA__name': 'studenta_name', '_StudentB__name': 'studentb_name', '_StudentC__name': 'studentc_name'}
print(c.__name)    # AttributeError: 'StudentC' object has no attribute '__name'

上面代码中定义了两个类StudentA和StudentB,且类StudentC多继承于StudentA和StudentB。

并且StudentA、StudentB和StudentC三个类都有一个同名的实例变量 __name。

由于在继承体系中可能存在同名的变量,因此需要加以区分。

注意观察可以发现,在类继承中,以 __ 开头,至多一个_结尾的变量在子类中会被改写为_{class_name}__{variable_name}。

在上例中,类StudentA的__name在子类StudentC中被改写为_StudentA__name,类StudentB的__name在子类StudentC中被改写为_StudentB__name,类StudentC的__name在子类StudentC中被改写为_StudentC__name。这样做可以有效避免类继承的情况下同名变量无法被区分的情况。

总结:

  • _x:约定的私有变量命名规范
  • __ x 或者 __ x _ :为了避免在继承中命名冲突而起的变量名,将被改写为 _{类名}__{变量名}
  • __ x __:是Python内建的属性方法,最好不要在外部调用,也称为魔法方法。

希望能帮助到各位!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Erudite_x

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值