python 面向对象之class和封装

yizhihongxing

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日

相关文章

  • javascript创建对象的几种模式介绍

    我来详细讲解“javascript创建对象的几种模式介绍”的完整攻略。 什么是对象? 在 JavaScript 中,对象就是一组无序的相关属性和方法集合。属性可以是数字或字符串,方法就是一个函数。在 JavaScript 中,对象是通过构造函数创建的,构造函数就是一个普通的 JavaScript 函数,在使用 new 关键字调用时,该函数会返回一个新的对象。…

    other 2023年6月26日
    00
  • DOS批处理中%~dp0等扩充变量语法详解

    DOS批处理中%~dp0等扩充变量语法详解攻略 在DOS批处理脚本中,%~dp0是一种扩充变量语法,用于获取当前批处理脚本所在的目录路径。这个语法非常有用,可以帮助我们在脚本中获取当前目录的路径,从而方便地执行一些操作。 语法解释 %~dp0:%0表示当前批处理脚本的名称,d表示获取驱动器号,p表示获取路径,0表示获取脚本的完整路径。 示例说明 示例一 假设…

    other 2023年8月9日
    00
  • springboot中请求路径配置在配置文件中详解

    一、简述 在Spring Boot中,我们可以将请求路径配置在配置文件中,避免了硬编码带来的困扰,可以更加方便的修改和管理请求路径信息。本文将详细阐述Spring Boot中请求路径配置在配置文件中的全过程,包括如何在配置文件中配置请求路径,以及如何在控制器中使用配置的请求路径。 二、配置请求路径 在Spring Boot中,配置请求路径需要在applica…

    other 2023年6月25日
    00
  • C语言详细讲解位运算符的使用

    C语言详细讲解位运算符的使用 什么是位运算? 位运算是一种直接操作二进制数位的运算,它包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)等操作。位运算常用于底层开发、算法优化等场景。 按位与运算符(&) 按位与运算符(&)的运算规则是:对于两个二进制数的对应位,如果都是1,结果是1;否则,结果是0。例如: unsigned…

    other 2023年6月27日
    00
  • 什么是人机交互?

    人机交互(HCI,Human-Computer Interaction)是指人类和计算机之间进行交互和通信的过程。这个领域涉及到许多不同的学科,包括计算机科学、心理学、人类学和设计。本文将详细讲解人机交互的完整攻略,包括设计过程、实现细节和测试方法。 1. 设计过程 设计过程是人机交互的核心,它涉及到理解用户需求、设计用户界面、实现系统功能和评估用户满意度。…

    其他 2023年4月19日
    00
  • ES6 关键字 let 和 ES5 及关键字 var 的区别解析

    ES6 关键字 let 和 ES5 及关键字 var 的区别解析 1. 声明和作用域 在ES5中,使用var关键字声明变量,而在ES6中,可以使用let关键字声明变量。 使用var声明的变量具有函数作用域,而使用let声明的变量具有块级作用域。 示例1: // ES5 function example1() { if (true) { var x = 5; …

    other 2023年8月21日
    00
  • linux命令rz

    Linux命令rz rz 命令是一个可以将本地计算机上的文件传输到远程 Linux 服务器中的命令,通常用于上传文件到服务器。它是 lrzsz 软件包中的一部分。 安装 lrzsz 在 Ubuntu 或 Debian 等基于 APT 的发行版中,你可以使用以下命令进行安装: sudo apt install lrzsz 在 CentOS 或 RHEL 等基于…

    其他 2023年3月28日
    00
  • Java 线程的生命周期完整实例分析

    Java 线程的生命周期完整实例分析 在 Java 中,线程是非常常见的概念。了解线程的生命周期对于正确编写多线程程序是非常重要的。本文将介绍 Java 线程的完整生命周期,并给出两个实例进行说明。 Java 线程的生命周期 Java 线程的生命周期可以归纳为以下 6 个阶段: 新建(New):当线程对象被创建后处于新建状态。 就绪(Runnable):当调…

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