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日

相关文章

  • Android中多个ContentProvider的初始化顺序详解

    Android中多个ContentProvider的初始化顺序详解 在Android开发中,我们可以使用ContentProvider来在不同的应用程序之间共享数据。但是,当多个ContentProvider同时存在时,它们的初始化顺序会影响到应用程序的运行。本文将详细解释多个ContentProvider的初始化顺序的相关概念和实现细节,以及如何解决由此引…

    other 2023年6月20日
    00
  • Python 多继承中的一个诡异现象 既是 Father又是grandfather

    针对Python多继承中的一个诡异现象,我会给出完整的攻略,包括示例说明。在Python中,多继承是一种同时继承多个父类的方式。然而,在多继承的情况下,可能会出现某个类同时继承了它的父类和祖先类的某个方法或属性的情况,导致代码执行结果不符合预期。 这个诡异现象的根本原因在于Python的MRO算法(multiple inheritance resolutio…

    other 2023年6月26日
    00
  • linux下设定环境变量的方法介绍

    当我们使用Linux时,经常需要设置环境变量来定义默认路径、库和一些其他信息。环境变量是值/路径对,通过该值可以直接在系统中引用路径、库等信息。本文将介绍如何在Linux中设置环境变量的方法。 1. 查看环境变量 在Linux中,我们可以使用env命令来查看已设置的环境变量。可以在终端中输入以下命令: env 这会显示系统中所有的环境变量,以键=值的形式列出…

    other 2023年6月27日
    00
  • spring初始化方法的执行顺序及其原理分析

    Spring初始化方法的执行顺序及其原理分析 在Spring容器启动时,会按照一定的规则初始化Bean,并在Bean初始化后执行一些定制化的操作。 BeanFactoryPostProcessor 在Spring容器启动时,第一步会执行BeanFactoryPostProcessor,它可以修改Bean的定义元数据,它的执行顺序是固定的,并且它只会被执行一次…

    other 2023年6月20日
    00
  • 如何修复macbookpro过热

    如何修复MacBook Pro过热问题 MacBook Pro是一款性能出色的笔记本电脑,但是很多人都会遇到它过热的问题。过热除了会降低电脑的性能外,还会对电脑主板和硬件设备造成损害,因此及时修复MacBook Pro过热问题非常重要。本文将介绍几个简单的方法,帮助你解决MacBook Pro过热的问题。 检查MacBook Pro的散热系统 MacBook…

    其他 2023年3月29日
    00
  • iOS自定义提示弹出框实现类似UIAlertView的效果

    下面我就来详细讲解一下“iOS自定义提示弹出框实现类似UIAlertView的效果”的完整攻略。 第一步:创建一个背景视图 我们首先需要创建一个背景视图,用于展示提示弹出框。可以使用UIView或者UIControl来实现,具体代码如下: UIView *bgView = [[UIView alloc] initWithFrame:[UIScreen mai…

    other 2023年6月25日
    00
  • shell截取字符串方法

    shell截取字符串方法 在Linux系统中,Shell编程是很常见的一种编程方式。而字符串处理是Shell编程中最常见和最重要的操作之一。本文将介绍Shell截取字符串的方法,以及详细的示例。 基础概念 在Shell编程中,字符串是由字符序列组成的,可以是数字、字母、符号、空格等。Shell截取字符串就是从原字符串中截取一部分,截取的部分可以是整个字符串、…

    其他 2023年3月28日
    00
  • 基于redis.properties文件的配置及说明介绍

    基于redis.properties文件的配置及说明介绍 在使用Redis时,我们需要对其进行配置,而对Redis进行配置的常用方式是通过配置文件,其中较为常用的配置文件是redis.properties文件。这里,我们将详细讲解如何对Redis进行配置,以此来为大家提供一个使用Redis的完整攻略。 1. 配置文件的读取 当我们使用Redis时,需要将Re…

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