python:类的私有成员

封装性是面向对象重要的基本特性之一。封装隐藏了对象的内部细 节,只保留有限的对外接口,外部调用者不用关心对象的内部细节,使 得操作对象变得简单。

私有变量

在默认情况下,Python中的变量是公有的,可以在类的外部访问它 们。

如果想让它们成为私有变量,则在变量前加上双下画线(__)即可

  • 类的私有属性__private_attrs:
    • 两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。
    • 在类内部的方法中使用时 self.__private_attrs。

在这里插入图片描述

访问私有变量

方法一

为了实现对象的封装,在一个类中不应该有公有的成员变量,这些 成员变量应该被设计为私有的,然后通过公有的set (赋值)和get(取 值)方法访问。

在这里插入图片描述

方法二

可以在类中定义属性来取代get()和set()这两个公有方法。

属性本质上就是两个方法,在方法签名加上装饰器使得方法成为属性。

在这里插入图片描述

__xx一定不能外部访问吗?

class Student(object):

    def __init__(self, name, score):
        self.__name = name
        self.__score = score

双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量:

>>> bart._Student__name
'Bart Simpson'

但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。

总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。

最后注意下面的这种错误写法:

>>> bart = Student('Bart Simpson', 59)
>>> bart.get_name()
'Bart Simpson'
>>> bart.__name = 'New Name' # 设置__name变量!
>>> bart.__name
'New Name'

表面上看,外部代码“成功”地设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量。不信试试:

>>> bart.get_name() # get_name()内部返回self.__name
'Bart Simpson'

__xx_x

  • __xx表示私有属性,不能在类外部访问
    • 双下划线开头的属性,是对象的隐藏属性,隐藏属性只能在类的内部访问,无法通过对象访问
    • 其实隐藏属性只不过是Python自动为属性改了一个名字
    • 实际上是将名字修改为了,_类名__属性名 比如 __name -> _Person__name
    • 使用__开头的属性,实际上依然可以在外部访问,所以这种方式我们一般不用
  • _x,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
    • 一般我们会将一些私有属性(不希望被外部访问的属性)以_开头
    • 一般情况下,使用_开头的属性都是私有属性,没有特殊需要不要修改私有属性
  • __xx__:是特殊变量,特殊变量是可以直接访问的,不是private变量。建议,不能用__name__、__score__这样的变量名。

私有方法

__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。

在这里插入图片描述

属性方法命名

单下划线、双下划线、头尾双下划三种分别是:

  • _foo(单下划线): 表示被保护的(protected)类型的变量,只能本身与子类访问,不能用于 from module import *
  • __foo(双下划线): 私有类型(private) 变量, 只允许这个类本身访问
  • __foo__(头尾双下划):特殊方法,一般是系统内置的通用属性和方法名,如 __init__()
    foo_(单后置下划线,单右下划线):用于避免与关键词冲突,也用于初始化参数中表示不需要用户传入的变量,通常会定义初始值,如 love_ = None

注:以上属性(变量)和方法(函数)均适用。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值