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

作者:PRO_Z 时间:2021-07-28 06:10:48 

理论

  • Python中不存在真正的私有方法。为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该去调用,它并不属于API。但是,这只是一个形式上的约定,python并不阻止调用。

  • __双下划线的作用是避免覆盖其内容,实现的机制是在带有双下划线的方法或属性前加上_类名的标识。由于,python自动对方法和属性进行了改写,所以直接调用带有双下划线的方法是调用不到的。

  • “xx”经常是操作符或本地函数调用的magic methods。在上面的例子中,提供了一种重写类的操作符的功能。它是用于Python调用的。

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__() 的使用

  • 在python中,方法名如果是__xx__()的话,那么就有特殊的功能,因此叫做“魔法”方法;

  • 当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据;

  • __str__()方法需要返回一个字符串,当做这个对象的描写。

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


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__等,这些方法并不是私有成员哦,虽然它们以双下划线开头,但是他们也是以双下划线结尾的,这种命名并不是私有成员的命名,

来源:https://www.cnblogs.com/nbk-zyc/p/13210735.html

标签:python,xx,()
0
投稿

猜你喜欢

  • Go语言中的IO操作及Flag包的用法

    2024-04-27 15:31:31
  • Python验证的50个常见正则表达式

    2023-07-11 02:58:57
  • Python判断字符串是否为合法标示符操作

    2023-09-28 18:49:01
  • python获取命令行参数实例方法讲解

    2022-12-10 06:40:32
  • SQL函数将某个字段合并在一起的操作

    2024-01-23 10:11:07
  • CSS布局之浮动(二)三列浮动

    2008-08-19 12:47:00
  • JavaScript实现Tab标签页切换的最简便方式(4种)

    2024-04-17 10:30:36
  • JavaScript 页面编码与浏览器类型判断代码

    2024-04-08 10:54:03
  • python web基础之加载静态文件实例

    2023-04-22 10:09:49
  • MySQL之information_schema数据库详细讲解

    2024-01-16 18:56:54
  • tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader

    2022-08-21 05:25:51
  • linux环境搭建图数据库neo4j的讲解

    2024-01-16 22:55:31
  • Python中IP地址处理IPy模块的方法

    2023-05-19 05:21:25
  • 多栏自适应布局问题浅谈

    2010-08-16 12:56:00
  • Javascript 两个窗体之间传值实现代码

    2024-04-22 22:31:11
  • Python数据分析之彩票的历史数据

    2021-06-16 07:53:39
  • Flask模拟实现CSRF攻击的方法

    2023-11-18 16:21:39
  • 未知高度的图片垂直居中

    2010-12-17 12:36:00
  • vue2 利用echarts 单独绘制省份的步骤

    2024-04-09 10:45:42
  • Sql Server 和 Access 操作数据库结构Sql语句

    2008-02-11 18:59:00
  • asp之家 网络编程 m.aspxhome.com