python 类(class)3

python 类(class)3

前言

本来想做成一个系列,后来感觉,写太多重复的东西反而有可能会影响阅读体验.
努力将教程写的简单,易懂,有实用价值.启发对内容的思考.
初稿就先这样将就着先吧.改天等一套内容写的差不多了,再重新整理一下吧.
每次回头看自己写的东西,都有点惨不忍睹的感觉.
本来就是因为看别人的教程感觉不是很符合一个读者,一个学习者的逻辑,所以想要将所学,尽可能写成易读易懂的样子.
慢慢努力吧

内容提要

  • 类中的__变量

类中的__变量

python中,在类的定义中在变量名前加双下划线的变量,称为类的私有属性,其本意是不让类的实例访问变量

class MyClass(object):
   def __init__(self):
       self.__name = "我是一个私有属性,实例无法直接访问"
mc = MyClass()
print(mc.__name)

在这里插入图片描述
可以看到,__name虽然看上去像是一个属性(定义在方法内,且用self.的方式声明的变量),但是在实际的应用中,我们却无法用mc.__name方式直接读取该值.
这样就起到了保护__name属性的作用.

但是这种保护是相对的,不是绝对的.与其他编程语言中的private 关键定义的属性不同,这种方法只是起到了一种形式上的保护.
我们可以用以下方法突破这种保护

  • 示例:突然类的私有属性的访问限制
# coding: utf-8
# 作者:爱编程的章老师
# 创建:2021/1/21 下午9:34 
# 邮箱:[email protected]
# 微信:slxxfl
# 微信公众号:A卫隆少儿编程
# 格言:给自己的生活增加一份向上的力,每都进步一点点

# 突然束缚. 类的私有属性的外在访问
class MyClass(object):
    def __init__(self):
    	# 定义一个私有属性,不希望被外界随意访问
        self.__name = "我是受保护变量,但我可以被特殊的方法访问"

mc = MyClass()
print(mc._MyClass__name)

在这里插入图片描述
可以看到,我们确确实实的获取到了这个变量的值

不仅是可以访问,改变也是可以的


# 类的私有属性的外在改变 示例
class MyClass(object):
    def __init__(self):
        self.__name = "我是受保护变量,但我可以被特殊的方法访问"

mc = MyClass()
print(mc._MyClass__name)  # 获取私有属性__name的值
mc._MyClass__name = "我也是可以被改变的"  # 改变私有属性__name的值
print(mc._MyClass__name)

在这里插入图片描述

私有属性不仅可以用在实例属性,也可以用在类属性上


# 类的私有属性
class MyClass(object):
    # 定义一个私有类属性
    __name = "我是受保护的类的属性,不可以直接访问"
    def __init__(self):
        self.name = ""
# 直接访问私有的类属性会报错
print(MyClass.__name)

在这里插入图片描述
可以看到,直接访问私有类属性会报错


# 类的私有属性
class MyClass(object):
    # 定义一个私有类属性
    __name = "我是受保护的类的属性,不可以直接访问"
    def __init__(self):
        self.name = ""
# 直接访问私有的类属性会报错
mc = MyClass()
print(mc._MyClass__name)

在这里插入图片描述
可以看到,确实被我们在外面找到了私有的类属性

总结

当我们在类的定义中给属性名前加上双下划线(__)时,是希望将这些属性保护起来,不让外界直接访问这些属性.从而使代码更健康.当然,这样定义的属性,除了起保护作用之外,还对后续的内容起到影响.
除了属性可以变成私有的,方法也可以变成私有的,操作方法同上.不再展开.可以自行尝试

定义:
私有实例属性:
self.__属性名
私有类属性:
__属性名

突然访问的方法:
私有实例属性: 实例名._类名__属性名
私有类属性: 实例名._类名__属性名
私有实例方法: 实例名._类名__方法名()

与其他语言的私有属性与私有方法不同,python的作法是将类的私有属性与方法进行了改名,使得我们不能直接用变量定义时的方法来访问使用,但是如果能够找到对应的属性(方法)名,还是可以突破这个限制的.

但是,当我们看到这些有双下划线的变量(方法)时,不建议去操作这些,以免破坏代码的整体性,导致不可预料的后果.

猜你喜欢

转载自blog.csdn.net/weixin_41810846/article/details/112973543