python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python __xx__()

python中 _、__、__xx__()区别及使用场景

作者:PRO_Z

这篇文章主要介绍了python中 _、__、__xx__() 区别及使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

理论

1、访问权限(private、public)与继承方式(只有public继承)

在面向对象编程语言中,类的属性与方法都会设置访问控制权限,从而满足我们的设计需求。一般而言,我们通常会将对象的属性设置为私有的(private)或受保护的(protected),简单的说就是不允许外界访问,而对象的方法通常都是公开的(public),因为公开的方法就是对象向外界提供的接口。 在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用 两个下划线作 为开头, 下面的代码可以验证这一点。

class Test:
 def __init__(self, foo):
  self.__foo = foo  # 私有属性

 # 定义私有函数,外界不可以直接访问,但是可以通过【_类名__函数名】去调用私有函数
 def __bar(self):
  print(self.__foo)
  print('__bar')

def main():
 """
 test = Test('hello')
 # AttributeError: 'Test' object has no attribute '__bar'
 test.__bar()
 # AttributeError: 'Test' object has no attribute '__foo'
 print(test.__foo)
 """
 
 # 使用以下这种方式就可以在类的外部调用类的私有属性与方法
 test._Test__bar()
 print(test._Test__foo)

if __name__ == "__main__":
 main()

在实际开发中,我们并不建议将属性设置为私有的,因为这会导致子类无法访问。所以大多数Python程序员会 遵循一种命名惯例,就是让属性名以 单下划线 开头来表示属性是受保护的 ,本类之外的代码在访问这样的属性时应该要保持慎重。这种做法并不是语法上的规则,单下划线开头的属性和方法外界仍然是可以访问的,所以更多的时候它是一种暗示或隐喻,让调用者知道这是不应该直接访问的属性或方法,而且这样做并不影响子类去继承这些东西。

2、__xx__() 的使用

案例:定义一个类描述数字时钟

import time

class Clock(object):
 """数字时钟"""

 def __init__(self, hour=0, minute=0, second=0):
  """初始化方法

  :param hour: 时
  :param minute: 分
  :param second: 秒
  """
  self._hour = hour
  self._minute = minute
  self._second = second

 def run(self):
  """走字"""
  self._second += 1
  if self._second == 60:
   self._second = 0
   self._minute += 1
   if self._minute == 60:
    self._minute = 0
    self._hour += 1
    if self._hour == 24:
     self._hour = 0

 def __str__(self):
  """显示时间"""
  return '%02d:%02d:%02d' %(self._hour, self._minute, self._second)


def main():
 clock = Clock(23, 59, 58)
 while True:
  print(clock)
  time.sleep(1)
  clock.run()

if __name__ == '__main__':
 main()

注意:Python类中的那些魔法方法,如__str__、__repr__等,这些方法并不是私有成员哦,虽然它们以双下划线开头,但是他们也是以双下划线结尾的,这种命名并不是私有成员的命名,

到此这篇关于python中 _、__、__xx__()区别及使用场景的文章就介绍到这了,更多相关python  _、__、__xx__() 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文