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

简介: 前言回顾一下,“对象”本质是一个代码封装思想,在编写的时候考虑尽可能完善的功能,后期直接调用即可,无需明确每一步是如何实现的,隐藏了可能重复出现的复杂逻辑,让使用者把精力放在新的探索和改进上。但是,我们在调用的时候有没有可能将某个对象的属性修改了呢?我们今天就一起来看看面向对象编程中对象class的外部访问——

前言


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

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

我们今天就一起来看看面向对象编程中对象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,感受一下面向对象编程的乐趣吧~

相关文章
|
27天前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
55 6
基于Python访问Hive的pytest测试代码实现
|
11天前
|
存储 Java 程序员
30天拿下Python之面向对象编程
30天拿下Python之面向对象编程
11 3
|
21天前
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。
|
23天前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
27天前
|
NoSQL JavaScript Java
Java Python访问MongoDB
Java Python访问MongoDB
20 4
WK
|
14天前
|
存储 安全 索引
如何在Python中访问字典中的值
在Python中,访问字典(Dictionary)中的值非常简单。字典是一种无序的集合,它存储了键值对(key-value pairs),其中每个键都是唯一的,并映射到一个值上。要访问字典中的值,你需要使用键作为索引。
WK
11 0
|
2月前
|
Python
Python 中的面向对象编程 (OOP)
【8月更文挑战第29天】
25 7
|
2月前
|
机器学习/深度学习 PHP 开发者
探索PHP中的面向对象编程构建你的首个机器学习模型:以Python和scikit-learn为例
【8月更文挑战第30天】在PHP的世界中,面向对象编程(OOP)是一块基石,它让代码更加模块化、易于管理和维护。本文将深入探讨PHP中面向对象的魔法,从类和对象的定义开始,到继承、多态性、封装等核心概念,再到实战中如何应用这些理念来构建更健壮的应用。我们将通过示例代码,一起见证PHP中OOP的魔力,并理解其背后的设计哲学。
|
2月前
|
Python
|
2月前
|
存储 Java C#
详解 Python 中的面向对象编程(2)
详解 Python 中的面向对象编程(2)
39 10