首页 > 编程语言 >Python数据类型之自定义类型——Class与面向对象编程详解

Python数据类型之自定义类型——Class与面向对象编程详解

时间:2024-10-31 15:51:05浏览次数:3  
标签:__ name 自定义 self 数据类型 面向对象编程 方法 class def

目录

引言

一、面向对象编程基础

二、类的定义与对象的创建

三、封装性

四、继承性

五、多态性

六、特殊方法与数据类

七、使用dataclass装饰器

八、面向对象编程的优势

结论



引言

Python是一门功能强大的编程语言,其面向对象编程(OOP)的特性更是为开发者提供了极大的灵活性和可扩展性。在Python中,通过定义类(class)可以创建自定义的数据类型,从而实现对复杂数据结构的抽象和封装。本文将详细介绍Python中的类与面向对象编程,包括类的定义、对象的创建、封装性、继承性、多态性等核心概念,并通过丰富的代码和案例帮助新手朋友理解和掌握这一重要特性。

一、面向对象编程基础

面向对象编程(Object Oriented Programming,简称OOP)是一种程序设计思想,它将对象作为程序的基本单元。一个对象包含了数据和操作数据的函数。OOP的三大特点是数据封装、继承和多态。

  • 对象:对象是类的实例,包含了数据和操作数据的函数。
  • 类:类是对象的蓝图或模板,它定义了一组属性和方法,通过实例化类可以创建对象。
  • 封装:封装是将数据和操作数据的函数绑定在一起,形成一个独立的单元。通过封装,可以隐藏对象的内部细节,只保留有限的对外接口,从而确保数据的安全性和完整性。
  • 继承:继承是面向对象编程中的一个重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以拥有父类的全部数据和操作,同时还可以添加自己的属性和方法。
  • 多态:多态是指在父类中定义的成员被子类继承后,可以具有不同的状态或表现行为。多态性使得子类可以覆盖父类的方法,从而实现不同的功能。

二、类的定义与对象的创建

在Python中,使用class关键字来定义一个类。类的定义包括类名和类体,类体中包含了属性和方法的定义。

class MyClass:  
    # 类属性  
    class_var = 0  
      
    # 构造函数,用于初始化实例属性  
    def __init__(self, arg1, arg2):  
        self.arg1 = arg1  # 实例属性1  
        self.arg2 = arg2  # 实例属性2  
      
    # 类方法,用于修改类属性  
    @classmethod  
    def class_method(cls):  
        cls.class_var += 1  
      
    # 实例方法,用于操作实例属性  
    def instance_method(self):  
        print(self.arg1, self.arg2)

在上面的示例中,MyClass是一个类,包含了类属性class_var、构造函数__init__、类方法class_method和实例方法instance_method。构造函数用于初始化实例属性,类方法用于修改类属性,实例方法用于操作实例属性。

通过实例化类可以创建对象。例如:

obj = MyClass('arg1 value', 'arg2 value')  
obj.instance_method()  # 输出 'arg1 value arg2 value'  
MyClass.class_method()  
print(MyClass.class_var)  # 输出 1

三、封装性

封装性是面向对象编程的一个重要特性,它使得外部访问者不能随意存取对象的内部数据,隐藏了对象的内部细节,只保留有限的对外接口。通过封装,可以确保数据的安全性和完整性,同时提供公共接口来操作数据,避免外部直接修改内部数据带来的风险。

在Python中,可以通过在属性名称前加上两个下划线__来定义私有属性,私有属性只能在类内部访问,不能在类的外部直接访问。

class Student:  
    def __init__(self, name, score):  
        self.__name = name  # 私有属性  
        self.score = score  
      
    def get_name(self):  
        return self.__name  # 提供公共接口访问私有属性  
      
    def set_name(self, name):  
        self.__name = name  # 提供公共接口修改私有属性

在上面的示例中,__name是一个私有属性,只能在Student类内部访问。通过定义get_name和set_name方法,提供了访问和修改私有属性的公共接口。

student = Student('Alice', 90)  
print(student.get_name())  # 输出 'Alice'  
student.set_name('Bob')  
print(student.get_name())  # 输出 'Bob'  
# print(student.__name)  # 会报错,因为__name是私有属性,不能在类的外部直接访问

四、继承性

继承性是面向对象编程中的一个重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以拥有父类的全部数据和操作,同时还可以添加自己的属性和方法。

class Animal:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
      
    def eat(self):  
        print(f"{self.name} is eating...")  
      
    def drink(self):  
        print(f"{self.name} is drinking...")  
  
class Cat(Animal):  
    def __init__(self, name, age, color):  
        super(Cat, self).__init__(name, age)  # 调用父类的构造函数  
        self.color = color  
      
    def eat(self):  
        print(f"{self.name} is eating fish...")  
      
    def info(self):  
        print(f"Cat info: name: {self.name}, age: {self.age}, color: {self.color}")

在上面的示例中,Cat类继承了Animal类,拥有了Animal类的所有属性和方法。同时,Cat类还添加了自己的属性color和方法info,并覆盖了父类的eat方法。

cat = Cat('Tom', 3, 'black')  
cat.eat()  # 输出 'Tom is eating fish...'  
cat.drink()  # 输出 'Tom is drinking...'  
cat.info()  # 输出 'Cat info: name: Tom, age: 3, color: black'

五、多态性

多态性是指在父类中定义的成员被子类继承后,可以具有不同的状态或表现行为。多态性使得子类可以覆盖父类的方法,从而实现不同的功能。

在Python中,多态性通常通过方法重写(Overriding)来实现。子类可以覆盖父类的方法,从而在调用该方法时表现出不同的行为。

class Shape:  
    def area(self):  
        pass  # 抽象方法,子类需要重写  
  
class Rectangle(Shape):  
    def __init__(self, width, height):  
        self.width = width  
        self.height = height  
      
    def area(self):  
        return self.width * self.height  
  
class Circle(Shape):  
    def __init__(self, radius):  
        self.radius = radius  
      
    def area(self):  
        return 3.14 * self.radius ** 2

在上面的示例中,Shape类是一个抽象基类,定义了一个抽象方法area。Rectangle类和Circle类分别继承了Shape类,并重写了area方法,实现了计算矩形和圆形面积的功能。

rectangle = Rectangle(4, 5)  
print(rectangle.area())  # 输出 20  
  
circle = Circle(3)  
print(circle.area())  # 输出 28.26

六、特殊方法与数据类

在Python中,类还可以定义一些特殊方法(如__str__、__eq__等),这些方法可以被内置函数和操作符调用,以实现更多的功能。

class Person:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
      
    def __str__(self):  
        return f"Person(name={self.name}, age={self.age})"  
      
    def __eq__(self, other):  
        if isinstance(other, Person):  
            return self.name == other.name and self.age == other.age  
        return False

在上面的示例中,Person类定义了__str__方法和__eq__方法。__str__方法用于返回对象的字符串表示,__eq__方法用于比较两个对象是否相等。

person1 = Person('Alice', 30)  
person2 = Person('Alice', 30)  
print(person1)  # 输出 'Person(name=Alice, age=30)'  
print(person1 == person2)  # 输出 True

此外,Python 3.7引入了dataclass装饰器,用于简化类定义过程,从而更方便地创建自定义数据类型。

from dataclasses import dataclass  
  
@dataclass  
class Rectangle:  
    width: float  
    height: float  
      
    def area(self):  
        return self.width * self.height  
      
    def perimeter(self):  
        return 2 * (self.width + self.height)

使用dataclass装饰器可以使得类定义更加简洁,同时还提供了默认的比较、表示(__repr__)和生成哈希值(__hash__)等方法,如果不需要自定义这些方法,使用dataclass可以大大减少代码量。

七、使用dataclass装饰器

dataclass装饰器是Python 3.7引入的,旨在简化类的定义,特别是那些主要用于存储数据的类。使用dataclass,你可以不必显式地定义__init__方法、__repr__方法以及其他一些特殊方法。

from dataclasses import dataclass  
  
@dataclass  
class Point:  
    x: float  
    y: float  
      
    def distance_to_origin(self):  
        return (self.x**2 + self.y**2) ** 0.5

在这个例子中,Point类有两个字段x和y,dataclass装饰器会自动生成一个__init__方法,使得你可以像这样创建Point对象:

p = Point(3, 4)  
print(p)  # 输出: Point(x=3, y=4)

同时,dataclass还默认生成了__repr__方法,提供了对象的字符串表示。

如果你需要自定义__init__方法的行为,或者需要添加其他特殊方法(如__eq__、__lt__等),你仍然可以在使用dataclass的同时定义这些方法。dataclass不会覆盖你自定义的方法。

八、面向对象编程的优势

面向对象编程通过封装、继承和多态等特性,为软件开发带来了许多优势:

  • 代码重用:通过继承,子类可以重用父类的代码,减少了重复代码,提高了开发效率。
  • 可维护性:封装使得类的内部实现细节被隐藏,只暴露必要的接口,这有助于减少系统间的依赖,使得代码更容易维护。
  • 可扩展性:多态性允许在不修改现有代码的情况下,通过添加新的子类来扩展系统的功能。
  • 灵活性:面向对象编程支持复杂的数据结构和行为建模,使得程序能够更灵活地应对现实世界中的问题。

结论

本文详细介绍了Python中的类与面向对象编程,包括类的定义、对象的创建、封装性、继承性、多态性以及特殊方法和dataclass装饰器的使用。通过面向对象编程,你可以创建更加模块化、可重用和易于维护的代码。希望这些内容能帮助你更好地理解和应用Python的面向对象编程特性。

标签:__,name,自定义,self,数据类型,面向对象编程,方法,class,def
From: https://blog.csdn.net/weixin_43856625/article/details/143393081

相关文章

  • 数据类型
    java:buteshortintlongmysql: tinyint(m) --m:限定拆线呢的时候的宽度tinyint--->byte tingintunsigned无符号  0-255tingint(1)--->booleanofalse1ture常用2个整数类型bigint(m)->java中long类型时间毫秒数int(5)zerofill:以0填充7.2浮点类型folat......
  • 面向对象编程
    面向对象编程OOP(objectorientedprogramming)面向对象编程面向过程(按照指定函数进行调用)面向对象包括:类和对象类:类是比函数更高级的一种代码组织形式,类是一个抽象的概念,是虚拟化出来的概念。什么是类:具有相同或相似性质的对象的抽象就是类。类具有属性,它是对象的状态......
  • windows 在词库中添加自定义短语,比如输入now可以选择当前日期加时间
    本文只记录添加在词库中添加自定义短语1、右击任务栏中的中英文切换的图标,选择“设置” 2、在”词库和自学习“中找到“用户定义短语”,点击添加或编辑自定义短语 3、点击“添加” 4、需要输入拼音、候选位置和短语拼音:now侯选位置:固定的选择序号短语:%yyyy%年%MM%月......
  • 关于Web前端使用JavaScript常见的数据类型处理小技巧
    1.1获取字符串长度  如果想获取这个字符串的长度,也就是它里面有多少个字符,可以使用 length 属性:consts="HelloWorld";console.log(s.length)1.2 转换大小写toUpperCase() 方法可以将字母全部大写consts="HelloWorld";console.log(s.toLowerCase());......
  • python进度库-tqdm的自定义能力
    今天罗列几个关于tqdm常见自定义场景。并尝试对动态更新描述信息做简单的封装,积累一些通用模块。tqdm 提供了丰富的自定义选项,可以让你根据不同的需求调整进度条的外观和行为,接下来看看他的自定义能力。tqdm函数参数:desc:进度条的描述信息。total:总迭代次数(默认为None......
  • 鸿蒙自定义编辑框与共享沙箱实现个性化输入法与编辑框的交互
    本文旨在深入探讨自定义编辑框与共享沙箱在跨应用数据共享方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在现代应用开发中,用户对于个性化体验......
  • 织梦 DedeCMS 自定义表单出现“数据校验证不对,程序返回”的解决方案
    问题:自定义表单提交时提示“数据校验不对,程序返回”。解决方法:找到新的 dede_fieldshash 值:打开后台-核心-频道模型-自定义表单。找到设置好的自定义表单,点击“前台预览”。如果提示前台预览关闭,点击“修改”,将“前台列表和内容也公开”选项勾选为“完全公开”......
  • 获取数据类型js
    functiongetFieldType(field){if(field===null){return'null';}switch(typeoffield){case'undefined':return'undefined';case'string':return&......
  • SD ComfyUI工作流 SVD自定义模型提示词图像转换
    文章目录SVD自定义模型提示词图像转换SD模型Node节点工作流程工作流下载效果展示SVD自定义模型提示词图像转换该工作流聚焦在StableDiffusion模型和LoRA堆叠的应用,通过一系列生成与优化节点将文本描述逐步转化为精细的图像,最终组合成视频。此流程包含了......
  • 基于STL的自定义栈与队列实现:灵活选择底层容器的模板设计
    文章目录代码模板设计主要成员函数底层容器的选择模板设计底层容器的选择关于stack的示例代码关于queue的示例代码前言:在本文中,我们将分析一个模拟C++标准模板库(STL)栈的自定义实现以及模仿C++标准模板库(STL)队列的自定义实现。该stack类模板允许在底层容器的选择......