python 面向对象之class和封装

Python 面向对象之 class 和封装

Python 是一种面向对象的编程语言,使用面向对象的思想可以更好地组织和管理代码,提高代码的可维护性和可复用性。在 Python 中,class 是面向对象的重要组成部分,而封装则是实现面向对象的重要机制之一。

class

class 是 Python 中面向对象编程的基础组成部分,可以通过 class 来定义一个对象的属性和方法。

class Car:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color

    def run(self):
        print(f'{self.color} {self.brand} is running.')

上面的代码定义了一个 Car 类,其中包含两个属性 brand 和 color,以及一个方法 run。其中,init 方法是类的构造函数,用于初始化对象的属性;而方法 run 则是对象的一个行为,用于模拟汽车的运行行为,并打印出汽车的品牌和颜色。

car = Car('Audi', 'Black')
car.run()

通过上述代码可以定义一个名为 car 的 Car 类对象,并通过调用 run 方法,模拟汽车的运行行为。

封装

封装是面向对象编程中的一种重要机制,在 Python 中可以通过访问控制权限来实现封装。

在 Python 中,有 3 种访问控制权限:

  • public:公有的,在类内部和外部都可以访问。
  • protected:受保护的,在类内部可以访问,在外部不建议直接访问。
  • private:私有的,只能在类内部访问,外部无法访问。

通过在属性或方法名前加上下划线来控制访问权限。

class Student:
    def __init__(self, name, age):
        self.name = name
        self._age = age
        self.__score = 0

    def do_homework(self):
        print(f'{self.name} is doing homework.')

    def take_exam(self, score):
        self.__score = score

    def get_score(self):
        return self.__score

上述代码定义了一个 Student 类,其中包含 3 个属性 name、_age 和 __score,以及 3 个方法 do_homework、take_exam 和 get_score。

在属性 _age 前面加上了一个下划线,表示这个属性是受保护的,在类内部可以访问,在外部不建议直接访问;在属性 __score 前面加上了两个下划线,表示这个属性是私有的,在类内部可以访问,在外部无法访问。

student = Student('Tom', 18)
print(student.name)
print(student._age)
student.do_homework()
student.take_exam(90)
print(student.get_score())

通过上述代码可以定义一个名为 student 的 Student 类对象,并通过调用相关方法和属性,模拟学生的学习和考试行为。其中,由于 __score 属性是私有的,外部无法直接访问,所以需要通过 get_score 方法来获取学生成绩。

示例说明

示例一:封装私有属性

class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
        self.__id_card = '0000000000000000'

    def get_id_card(self):
        return self.__id_card

    def set_id_card(self, id_card):
        if len(id_card) == 18 and id_card.isdigit():
            self.__id_card = id_card
        else:
            raise ValueError('Invalid id card.')

person = Person('Tom', 18, 'male')
person.set_id_card('111111111111111111')
print(person.get_id_card())  # 输出:111111111111111111
person.set_id_card('111')  # 抛出 ValueError 异常,提示无效的身份证号码

上面的代码定义了一个 Person 类,其中包含 4 个属性 name、age、gender 和 __id_card,以及两个方法 get_id_card 和 set_id_card。

由于 __id_card 属性是私有的,外部无法直接访问,所以需要通过 get_id_card 和 set_id_card 方法来获取和设置身份证号码。在 set_id_card 方法内部对身份证号码进行了简单的校验,只有当新的身份证号码长度为 18 并且全是数字时才允许设置成功。

示例二:封装私有方法

class StringHelper:
    def __init__(self, string):
        self.string = string

    def reverse(self):
        def _reverse(string):
            if len(string) <= 1:
                return string
            return _reverse(string[1:]) + string[0]

        return _reverse(self.string)

    def __clean(self, string):
        return ''.join(filter(str.isalnum, string)).lower()

    def is_palindrome(self):
        return self.__clean(self.string) == self.__clean(self.reverse())

string_helper = StringHelper('A man, a plan, a canal: Panama')
print(string_helper.reverse())  # 输出:amanaP :lanac a ,nalp a ,nam A
print(string_helper.is_palindrome())  # 输出:True

上面的代码定义了一个 StringHelper 类,其中包含 2 个属性 string 和一个私有方法 __clean,以及 2 个方法 reverse 和 is_palindrome。

由于 __clean 方法是私有的,外部无法直接访问,所以需要通过 reverse 方法来调用它。__clean 方法的作用是将字符串中的非字母和数字字符过滤掉,并将剩余的字符转换成小写字母,用来判断是否回文。is_palindrome 方法调用了 reverse 方法和 __clean 方法,用来判断当前字符串是否回文。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 面向对象之class和封装 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • IP 正则表达式验证

    IP 正则表达式验证攻略 IP 正则表达式验证是一种用于验证 IP 地址格式是否正确的方法。正则表达式是一种强大的模式匹配工具,可以用来检查字符串是否符合特定的模式。下面是一个详细的攻略,包含了 IP 正则表达式验证的过程和两个示例说明。 步骤一:了解 IP 地址格式 IP 地址是一个由四个数字组成的字符串,每个数字的取值范围是 0 到 255,数字之间用点…

    other 2023年7月31日
    00
  • js实现千位分隔

    js实现千位分隔 在前端开发中,我们常会遇到需要对数值进行千位分隔的情况,即将数值以3位一组的形式进行分隔,并用逗号将其连接起来展示在页面上,以提高数字的可读性。下面,我们来介绍一下如何使用Js实现千位分隔。 方法一:正则表达式 正则表达式是一种强大的文本处理工具,可以用来进行字符串的匹配和替换,也可以用来实现千位分隔。实现方式如下: function fo…

    其他 2023年3月28日
    00
  • 只需2招限制自启应用程序

    当你启动电脑时,可能会发现很多应用程序会自动启动,这些应用程序会降低电脑的启动速度,加大系统负担,因此限制启动程序数量是非常有必要的。 以下是限制自启应用程序的完整攻略: 第一招:使用“任务管理器”禁用自启应用程序 打开任务管理器方法:在电脑桌面上单击右键,选择“任务管理器”,或者使用快捷键“Ctrl + Shift + Esc”打开。 找到“启动”选项卡,…

    other 2023年6月25日
    00
  • 深入理解ES6中let和闭包

    深入理解ES6中let和闭包攻略 1. let关键字的作用和特点 在ES6中,let关键字用于声明块级作用域的变量。相比于var关键字,let具有以下特点: let声明的变量只在块级作用域内有效,不会被提升到整个函数作用域。 同一个作用域内,不允许重复声明同名的let变量。 let声明的变量不存在变量提升,必须在声明之后使用。 下面是一个示例说明let关键字…

    other 2023年8月20日
    00
  • docker创建redis镜像的方法

    当我们需要在多个应用程序之间共享数据时,Redis是一种优秀的选择,它可以存储双向映射,列表,缓存等,并且以高效的方式进行处理。本文将详细讲解如何使用Docker创建Redis镜像。 准备工作 在开始之前,请确保已经安装了Docker和Docker Compose,并且熟悉基本的Docker命令和Dockefile语法。 创建Dockerfile 首先,在项…

    other 2023年6月27日
    00
  • 使用C++一步步实现俄罗斯方块后续

    使用C++一步步实现俄罗斯方块后续攻略 一、前言 俄罗斯方块(Tetris)是一款老少皆宜的游戏,很多人都喜欢玩。这个游戏也是比较有代表性的游戏之一。本攻略将会演示如何使用C++来一步步实现俄罗斯方块游戏。 二、准备工作 在开始前,需要确保电脑上有C++编译器。推荐使用Visual Studio。 三、步骤 1. 创建一个窗口 我们首先需要创建一个窗口,用于…

    other 2023年6月26日
    00
  • 将Linux代码移植到Windows的简单方法

    将Linux代码移植到Windows有多种方法和工具可以实现,不同的方法针对的目标和情况各不相同。本篇攻略主要介绍一种基于WSL(Windows Subsystem for Linux)的简单方法,这种方法可以让我们在Windows上使用Linux的编译工具链和运行环境,轻松地将Linux代码移植到Windows上,并在Windows上进行编译、测试和调试。…

    other 2023年6月26日
    00
  • Android自定义LinearLayout布局显示不完整的解决方法

    Android自定义LinearLayout布局显示不完整的解决方法攻略 在Android开发中,有时候我们可能会遇到自定义LinearLayout布局显示不完整的问题。这种情况通常发生在布局中包含了大量的子视图或者子视图的尺寸设置不当时。下面是解决这个问题的一些方法和示例说明。 方法一:使用ScrollView包裹LinearLayout 如果Linear…

    other 2023年8月6日
    00
合作推广
合作推广
分享本页
返回顶部