隐藏类中的属性 | Python从入门到精通:高阶篇之二十七

简介: 本节我们首先要对封装的总体思路做了补充,然后介绍了隐藏类中的属性的2种方法,避免外部可以随意访问。

封装简介 | Python从入门到精通:高阶篇之二十六

封装

针对上一节的知识,我们来做一个补充:
封装的第五个优点:
使用getter方法可以表示一些计算的属性。

class Rectangle:
    '''
        表示矩形的类
    '''
    def __init__(self,width,height):
        self.hidden_width = width
        self.hidden_height = height

    def get_width(self):
        return self.hidden_width

    def get_height(self):
        return self.hidden_height   

    def set_width(self , width):
        self.hidden_width = width 

    def set_height(self , height):
        self.hidden_height = height 

    def get_area(self):
        return self.hidden_width * self.hidden_height        

r = Rectangle(5,2)  

print(r.get_area())     

执行结果:

image.png

若改变宽度、高度,面积则进行了改变。

r.set_width(10)
r.set_height(20)

执行结果:

image.png
image.png

隐藏类中的属性

先定义一个新类。

class Person:
    def __init__(self,name):
        self.hidden_name = name

    def get_name(self):
        return self.hidden_name

    def set_name(self , name):
        self.hidden_name = name        

p = Person('孙悟空')

print(p.get_name())

执行结果:

image.png

此时对name做一个修改:

p.set_name('猪八戒')
p.hidden_name = '沙和尚'

执行结果:

image.png
image.png

此时可以发现,有时隐藏了外部也是可以访问的,这是想要把隐藏的更彻底,外部无法访问。
此时可以为对象的属性使用双下划线开头,__xxx。
双下划线开头的属性,是对象的隐藏属性,隐藏属性只能在类的内部访问,无法通过对象访问。

class Person:
    def __init__(self,name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_name(self , name):
        self.__name = name        

p = Person('孙悟空')

# print(p.__name)  __开头的属性是隐藏属性,无法通过对象访问
p.__name = '猪八戒'  

print(p.get_name())

执行结果:

image.png
image.png
image.png

此时也无法进行修改。
其实隐藏属性只不过是Python自动为属性改了一个名字,实际上是将名字修改为了,_类名__属性名 ,比如__name -> _Person__name。

print(p._Person__name)
p._Person__name = '猪八戒'

执行结果:

image.png
image.png

此时是可以访问的,也是可以修改的。

使用__开头的属性,实际上依然可以在外部访问,所以这种方式我们一般不用。
一般我们会将一些私有属性(不希望被外部访问的属性)以_开头。

class Person:
    def __init__(self,name):
        self._name = name

    def get_name(self):
        return self._name

    def set_name(self , name):
        self._name = name   

p = Person('孙悟空')

print(p._name)

执行结果:

image.png

一般情况下,使用_开头的属性都是私有属性,没有特殊需要不要修改私有属性。

配套视频课程,点击这里查看

获取更多资源请订阅Python学习站

相关文章
|
7天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
2天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第24天】本文将带你进入Python的世界,从最基础的语法开始,逐步深入到实际的项目应用。我们将一起探索Python的强大功能和灵活性,无论你是编程新手还是有经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python的奇妙之旅吧!
|
4天前
|
数据采集 存储 数据库
Python中实现简单爬虫的入门指南
【10月更文挑战第22天】本文将带你进入Python爬虫的世界,从基础概念到实战操作,一步步指导你如何使用Python编写一个简单的网络爬虫。我们将不展示代码示例,而是通过详细的步骤描述和逻辑讲解,帮助你理解爬虫的工作原理和开发过程。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你打开一扇通往数据收集新世界的大门。
|
2天前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
【10月更文挑战第24天】 在Python的世界里,装饰器是一个既神秘又强大的工具。它们就像是程序的“隐形斗篷”,能在不改变原有代码结构的情况下,增加新的功能。本篇文章将带你走进装饰器的世界,从基础概念出发,通过实际例子,逐步深入到装饰器的高级应用,让你的代码更加优雅和高效。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往高效编程的大门。
|
4天前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
13 3
|
3天前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
机器学习基础:使用Python和Scikit-learn入门
11 1
|
5天前
|
存储 程序员 开发者
Python编程入门:从零开始掌握基础语法
【10月更文挑战第21天】本文将带你走进Python的世界,通过浅显易懂的语言和实例,让你快速了解并掌握Python的基础语法。无论你是编程新手还是想学习一门新的编程语言,这篇文章都将是你的不二之选。我们将一起探索变量、数据类型、运算符、控制结构、函数等基本概念,并通过实际代码示例加深理解。准备好了吗?让我们开始吧!
|
9天前
|
存储 算法 Python
【10月更文挑战第16天】「Mac上学Python 27」小学奥数篇13 - 动态规划入门
本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。
69 3
|
5天前
|
数据采集 机器学习/深度学习 数据可视化
深入浅出:用Python进行数据分析的入门指南
【10月更文挑战第21天】 在信息爆炸的时代,掌握数据分析技能就像拥有一把钥匙,能够解锁隐藏在庞大数据集背后的秘密。本文将引导你通过Python语言,学习如何从零开始进行数据分析。我们将一起探索数据的收集、处理、分析和可视化等步骤,并最终学会如何利用数据讲故事。无论你是编程新手还是希望提升数据分析能力的专业人士,这篇文章都将为你提供一条清晰的学习路径。
|
6天前
|
调度 开发者 Python
探索Python中的异步编程:从入门到精通
在这个快节奏的技术时代,异步编程成为了提升应用性能的关键。本文将带你深入Python的异步编程世界,从基础概念到高级技巧,一探究竟。我们将一起学习如何利用Python的asyncio库来构建高效、响应迅速的异步应用。摘要部分,我们将以一个独特的视角,用一个简短的故事来吸引读者的兴趣,而不是传统的介绍性文字。