Python面向对象编程之外部访问

105 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

✔个人主页:Mr.Darcy8的掘金主页

🎉欢迎关注👀点赞👍收藏⭐留言📝以及交流人生哲理🎈学习心得🎁

前言

回顾一下,“对象”本质是一个代码封装思想,在编写的时候考虑尽可能完善的功能,后期直接调用即可,无需明确每一步是如何实现的,隐藏了可能重复出现的复杂逻辑,让使用者把精力放在新的探索和改进上。

但是,我们在调用的时候有没有可能将某个对象的属性修改了呢?

我们今天就一起来看看面向对象编程中对象class的外部访问——

1.外部修改

class jueyou(object):
    def __init__(self,name,number):
        self.name=name
        self.number=number 
    def print_number(self):
        print(f"{jueyou["name"]}更新了{jueyou["number"]}篇文章")

来回顾一下我们上期介绍面向对象编程初步的时候举例的代码。用这样的方式定义的class可以自由地被外部代码修改属性:

juejin1 = jueyou('小明', 60)
juejin1.number#输出60
juejin1.number = 100
juejin1.number#输出100

2.外部访问限制

如果希望指定的内部数据不会被外部修改,我们可以在定义的时候将实例的变量设置为“私有变量”(private):

class jueyou(object):
    def __init__(self,name,number):
        self.__name=name
        self.__number=number
    def print_number(self):
        print(f"{jueyou["name"]}更新了{jueyou["number"]}篇文章")

如上,我们只需要在代码中的变量名定义前面加__(两条下划线)即可。这样设置之后的实例在使用的时候没有区别,但是实例的变量已经无法单独从外部访问了。

>>>juejin1 = jueyou('小明', 60)
>>>juejin1.__number
Traceback (most recent call last):
  File "<jueyou>", line 1, in <module>
AttributeError: 'jueyou' object has no attribute '__number'

这样一来我们就实现了对实例变量的外部修改权限的自定义。 对那些我们希望作为外部使用接口的变量我们设置为开发权限的变量,方便外部访问;对那些功能固定且复杂、维护可能不大方便的实例变量,我们设置为private私有变量让外部无法访问。

3.高级维护方法

“外部无法访问和修改”——话是这么说没错,可要是真的在定义的时候设置好了,之后就完全不可逆,那也有点反人类,因为其降低了程序设计本身的操作性

总不能一个堂堂正正的编程语言弄得和低代码产品一样吧?

如果对私有变量确实存在需要外部访问和调整的需求,我们可以在类中加上get方法

class jueyou(object):
    ......
    def get_name(self)
        return self.__name
    # 也不一定要用get,只是一般这样设置。按大多数人约定俗成的习惯来对其他用户毕竟友好
    # number的同理,这里不再写了

我们设计一个内部函数,从内部返回这个私有变量就可以解决问题了~

同理,如果我们需要修改某个私有变量,我们可以也用类似的方法:

# ……前置代码省略
def set__number(self,number):
    self.__number=number

这样的私有变量修改方式除了修改门槛提高,避免外部误修改之外,还有一个好处:

你可以进行参数检查

# ……前置代码省略
def set__number(self,number):
    if number == int(number):
        self.__number=number
    else:
        raise ValueError("article number should be int")

如上,当我们想要更新文章数量为小数的时候,就会报错了。

4.私有变量的原理

其实学习完了上面的章节,我们已经具备了使用外部访问限制来定义实例变量的能力了。

但是大家是不是有点好奇,python是怎么实现这个私有变量功能的呢?

恐怕要让大家失望了。不是什么高端的操作。其实就是python解释器在解释的时候把私有变量的名字改了……

不过每个版本的解释器可能改的名字不一样,比如有些版本的解释器会把私有变量改成_实例名__变量名

>>> juejin1._jueyou__name
'小明'

你如果知道自己用的版本的python会把私有变量解释成什么名字,并且在外部调用他解释后的新名字,自然就可以访问到变量了…… 还可以随意修改,就像普通变量一样……

有没有一种被骗的感觉?搞了半天其实并没有什么私有公有,只是人为设置的一个概念?

其实,我们现在丰富多彩的计算机世界就是人为设置出来的呀

宇宙的基础是物理和数学,我们现在的一切都是前辈们利用公理不断创造出来的,色彩缤纷的液晶显示器、你们朝思暮想的4090ti、音响、无线电……

请相信,人类的创造力是无穷的

小小跑题了……我们回顾一下本文内容:

  • 外部访问定义
  • 外部修改方法
  • 外部访问限制
  • 外部访问的高级操作
  • 外部访问限制原理

打开IDE,感受一下面向对象编程的乐趣吧~

新人上路,欢迎互相帮扶~Mr_darcy8的掘金主页

可以的话给咱点个赞呗💖