Python3:私有成员

目录

1.什么是私有成员

2.私有成员并非真正私有

3.私有函数调用方法


1.什么是私有成员

在Python里边,一个类的成员(成员变量、成员方法)是否为私有,完全由这个成员的名字决定如果一个元成员的名字以两个下划线__开头,但不以两个下划线__结尾,则这个元素为私有的(private);否则,则为公有的(public)。Pyhton里边并没有protected的概念。

私有成员不以两个下划线结尾;所有的运算符重载相关方法,以一些特殊的成员方法如构造函数,都是以两个下划线开头,两个下划线结尾,而且它们都是公有的。

私有成员,即只能在这个类里边访问;如果你在类外面访问一个私有成员,系统会抛出一个异常,提示你这个成员不存在。请看如下代码:

private_demo_1.py

# -*- coding: UTF-8 -*-
"""
# Python3: 私有成员
"""


class Demo:
    def __init__(self):
        self.__name = "xiaoming"

    def hello(self):
        # 在类内部使用私有成员变量__name
        print("my name is: %s." % self.__name)


ins = Demo()

# 正常输出
ins.hello()

# 抛异常,提示__name不存在
print("name: %s" % ins.__name)

输出:

my name is: xiaoming.
Traceback (most recent call last):
  File "private_demo.py", line 21, in <module>
    print("name: %s" % ins.__name)
AttributeError: 'Demo' object has no attribute '__name'

可以看出来,可以在类的内部(成员方法中)使用私有变量__name。但当直接在外部访问__name时,会收到一个异常,提示Demo类的对象没有__name方法。显然,这个异常的提示具有误导性,因为__name实际上存在,知识不能直接访问。

2.私有成员并非真正私有

其实,是可以在类的外面访问私有成员,方法是,在私有成员的名字前面加上一个下划线和类型,示例如下:

代码如下:

private_demo_2.py

# -*- coding: UTF-8 -*-
"""
# Python3: 私有成员
"""


class Demo:
    def __init__(self):
        self.__name = "xiaoming"

    def hello(self):
        # 在类内部使用私有成员变量__name
        print("my name is: %s." % self.__name)


ins = Demo()
# 正常输出
ins.hello()

# 通过_Demo__name可以在外部访问私有变量__name
print("name: %s" % ins._Demo__name)

输出:

my name is: xiaoming.
name: xiaoming

可以看到,我们可以通过_Demo__name的方式在外部访问私有变量__name。然而,在实际开发过程中,如果没有特殊的需要,请不要这么做。我们将一个成员声明为私有,具有一定的原因的,其中一个最主要的原因,就是不希望使用者直接访问。虽然我们可以这样做,但请务必遵守这个约定,避免出现不必要的问题。

3.私有函数调用方法

python中似有的概念:

  • 私有函数不可以从它们的模块外面被调用
  • 私有类方法不能够从它们的类外面被调用
  • 私有属性不能够从它们的类外面被访问

从上面的简单示例可以看出:Python私有访问的理念与其它编程语言基本一致,但实现却有一丢丢特殊,一个 Python 函数,方法,或属性是私有还是公有,完全取决于它的名字

如果一个 Python 函数,类方法,或属性的名字以两个下划线开始(但不是结束),它是私有的;其它所有的都是公有的。 Python 没有类方法 保护 的概念(只能用于它们自已的类和子类中)。类方法或者是私有(只能在它们自已的类中使用)或者是公有(任何地方都可使用)。

在 Python 中,所有的专用方法和内置属性遵守一个标准的命名习惯:开始和结束都有两个下划线。不要对你自已的方法和属性用这种方法命名;到后面,它只会把你(或其它人)搞乱。 私有方法由于某种原因而私有,但是象其它很多在 Python 中的东西一样,它们的私有化基本上是习惯问题,而不是强迫的。示例如下:

private_demo_3.py

# -*- coding: UTF-8 -*-
"""
# Python3: 私有成员
"""


class Demo:
    # 私有类方法
    def __privatefun(self):
        print('this is private function')


ins = Demo()
# 抛异常,'Demo' object has no attribute '__privatefun'
# ins.__privatefun()

# 通过_Demo____privatefun可以正常调用类方法
ins._Demo__privatefun()

我们从类的外部调用了类的私有方法!这是一个很有意思的技巧,但是切记我们不应该这样使用。

猜你喜欢

转载自blog.csdn.net/sinat_33718563/article/details/119710375