首页 > 编程语言 >python面向对象(一)

python面向对象(一)

时间:2024-11-06 20:20:42浏览次数:4  
标签:__ .__ name python sno self 面向对象 属性

前言

Python是一种功能强大的编程语言,因其简洁的语法和强大的库而备受开发者喜爱。而在Python中,面向对象编程(OOP)是一种核心的编程范式,它通过模拟现实世界中的对象和交互来帮助我们设计清晰、易维护的代码。

在本篇博客中,我们将深入探讨Python的面向对象编程的基本概念,了解如何通过类(class)和对象(object)来组织代码,并掌握继承、封装和多态等面向对象的核心原则。这些概念不仅能帮助我们编写更具可扩展性的代码,还能让我们更容易理解和解决复杂问题。

让我们从最基本的面向对象编程概念开始,逐步带你走向掌握Python OOP的道路

类 class

在面向对象编程(OOP)中,类(class)是创建对象的蓝图或模板。类定义了对象的属性(也叫字段或变量)和行为(也叫方法或函数)。你可以通过类来组织和封装数据与功能,从而使得代码更加模块化、可重用且易于维护。

在Python中,类通过 class 关键字来定义。类中的属性通常由构造方法 init 来初始化,而类中的方法则定义了对象能够执行的操作。通过类,我们可以创建多个对象,每个对象都有自己的属性和方法

class Student:
    # 构造方法
    def __init__(self, name, age):
        self.name = name  # 学生姓名
        self.age = age    # 学生年龄

    # 类的方法
    def introduce(self):
        print(f"大家好,我是{self.name},今年{self.age}岁。")

在这个例子中,Student 是一个类,它有两个属性:name(姓名)和 age(年龄)。通过 init 构造方法,这些属性会在创建对象时进行初始化。此外,introduce 方法则是学生的一个行为,用于输出学生的自我介绍

创建对象

类定义好之后,我们可以通过类创建对象。每个对象都是类的实例,并且会拥有类中定义的属性和方法。

# 创建学生对象
student1 = Student("张三", 20)

# 调用对象的方法
student1.introduce()

执行上述代码后,输出结果将是

大家好,我是张三,今年20岁。

类是面向对象编程的基础,它为我们提供了一个结构化的方式来组织数据和功能。通过定义类,我们可以创建出多个具有相同属性和行为的对象。Python中的类使得代码更具可读性和可维护性,并且能够促进代码的重用

私有属性

在面向对象编程中,私有属性(Private Attributes)是类的属性之一,其设计目的是限制对该属性的直接访问,从而保护数据的封装性和隐私性。在Python中,私有属性并没有强制性的访问控制机制,但我们可以通过约定俗成的命名规则来表示某个属性是私有的。

如何定义私有属性

在Python中,通过在属性名称前加上两个下划线(__)来表示该属性为私有属性。这是Python的命名约定,用于指示该属性是类的内部使用,不应在类的外部直接访问
示例:

class Person:
    def __init__(self, name, age):
        self.__name = name   # 私有属性
        self.__age = age     # 私有属性

    def introduce(self):
        print(f"大家好,我是{self.__name},今年{self.__age}岁。")

    # 公共方法访问私有属性
    def get_name(self):
        return self.__name

    def get_age(self):
        return self.__age

在这个例子中,__name 和 __age 都是私有属性。通过这种方式,外部代码无法直接访问这些属性,而只能通过类中提供的公共方法(如 get_name() 和 get_age())来间接访问。

访问私有属性

如果你尝试在类的外部直接访问私有属性,Python会抛出AttributeError,提示你无法访问该属性。

person = Person("李四", 25)
print(person.__name)  # 会抛出错误,AttributeError: 'Person' object has no attribute '__name'

使用公共方法访问私有属性

为了能够访问这些私有属性,我们可以提供公共方法,比如 getter 方法和 setter 方法,用于获取和设置私有属性的值:

print(person.get_name())  # 正常输出:李四
print(person.get_age())   # 正常输出:25

对象的字符串表示形式

def str(self): : 以 字符串的形式 表示对象, 当 使用 str(x) 函数的时候, , 会调用 x 对象的 str 方法完成对象到字符串的转换
def repr(self): : 主要给 打印 print 函数提供调用, 当 print(x) 的时候, 会 自动调用 repr 函数。

class Person:
    def __init__(self, *, name=None, sex=None, birth=None):
        # 定义属性 并给属性赋值
        self.name = name
        self.sex = sex
        self.__birth = birth

    def show(self):
        """显示人的信息"""
        print(f"姓名{self.name}, 性别是:{self.sex}, 出生日期是:{self.__birth}")

    def __str__(self):
        """该函数的职责 将对象 以 字符串的形式表示、函数必须返回一个字符串、主要给 str()函数实现的。"""
        return f"( name={self.name}, sex={self.sex}, birth={self.__birth} )"

    def __repr__(self):
        """该函数主要给 print函数提供打印效果"""
        return str(self)

property 类

用来 解决 类中的 私有属性 问题 的

class Student:
    """学生类"""

    def __init__(self, *, name=None, sex=None, sno=None):
        self.__name = name    # field 属性
        self.__sex = sex
        self.__sno = sno

    def instruction(self):
        """自我介绍"""
        print(f"我叫{self.__name}, 性别是{self.__sex},学号是{self.__sno}")
    
    def get_sno(self):
        return self.__sno

    def set_sno(self, sno):
        """修改私有属性学号"""
        self.__sno = sno

    def del_sno(self):
        del self.__sno
        
    sno = property(get_sno, set_sno, del_sno)
    
    
if __name__  == "__main__":

   stu = Student(name="张三")
   stu.sno =  "10000"   # 修改学号,自动调用 set_sno 方法
   
   print(stu.sno)       #  获取学号,自动调用 get_sno 方法

property 装饰器

在Python中,property 装饰器提供了一种优雅的方式,允许我们将方法转换为属性访问方式,从而使得在访问类的私有属性时更加灵活和简洁。使用 property 装饰器,我们可以控制对属性的访问,允许我们在获取、设置或删除属性时执行一些额外的操作,而无需直接暴露类的内部实现

class Student:
    """学生类"""

    def __init__(self, *, name=None, sex=None, sno=None):
        self.__name = name    # field 属性
        self.__sex = sex
        self.__sno = sno

    def instruction(self):
        """自我介绍"""
        print(f"我叫{self.__name}, 性别是{self.__sex},学号是{self.__sno}")

    
    @property
    def sno(self):
        return self.__sno

    @sno.setter
    def sno(self, sno):
        """修改私有属性学号"""
        self.__sno = sno

    @sno.deleter
    def sno(self):
        del self.__sno

标签:__,.__,name,python,sno,self,面向对象,属性
From: https://blog.csdn.net/m0_64881179/article/details/143578744

相关文章

  • 【PAT_Python解】1114 全素日
    原题链接:PTA|程序设计类实验辅助教学平台Tips:以下Python代码仅个人理解,非最优算法,仅供参考!多学习其他大佬的AC代码!defis_prime(n):ifn<=3:returnn>=2ifn%6notin(5,1):returnFalseforiinrange(5,int(n**0.5)+1,6):......
  • 【PAT_Python解】1110 区块反转
    原题链接:PTA|程序设计类实验辅助教学平台Tips:以下Python代码仅个人理解,非最优算法,仅供参考!多学习其他大佬的AC代码!importsys#读取输入head,n,k=map(int,sys.stdin.readline().split())#初始化数据,装入字典,最终取值data={}next={}for_inrange(n):......
  • 【PAT_Python解】1113 钱串子的加法
    原题链接:PTA|程序设计类实验辅助教学平台Tips:以下Python代码仅个人理解,非最优算法,仅供参考!多学习其他大佬的AC代码!defadd_base30(num1,num2):max_length=max(len(num1),len(num2))#在前面补零,使两个字符串长度相同num1=num1.zfill(max_lengt......
  • Java面向对象进阶学习一
    this关键字使用this使用的变量时属性,没有使用的是形参this可以调用结构,成员变量,方法this的理解,当前对象(在方法中调用时),或当前正在创建的对象(在构造器中调用时)针对方法内的使用情况一般情况下,我们通过对想a调用方法,可以在方法内调用当前对象a的属性或其他的方法,此时,我们可......
  • 0基础学Python——类的单例模式、反射函数、记录类的创建个数、迭代器、生成器及生成
    0基础学Python——类的单例模式、反射函数、记录类的创建个数、迭代器、生成器及生成器练习类的单例模式定义代码演示反射函数代码演示记录类的创建个数迭代器定义特点生成器定义特点写法生成器练习生成器生成1-无穷的数字生成器生成无穷个素数类的单例模式定义......
  • 0基础学Python——面向对象-可迭代、面向对象-迭代器、call方法、call方法实现装饰器
    0基础学Python——面向对象-可迭代、面向对象-迭代器、call方法、call方法实现装饰器、计算函数运行时间面向对象--可迭代实现方法面向对象--迭代器实现方法call方法作用call方法实现装饰器代码演示计算函数运行时间代码演示面向对象–可迭代把对象看做容器,存储......
  • 基于卷积神经网络的柑桔病害识别与防治系统,resnet50,mobilenet模型【pytorch框架+pytho
     更多目标检测和图像分类识别项目可看我主页其他文章功能演示:柑橘病害识别与防治系统,卷积神经网络,resnet50,mobilenet【pytorch框架,python源码】_哔哩哔哩_bilibili(一)简介基于卷积神经网络的柑桔病害识别与防治系是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,......
  • Python 日志分级记录到不同文件的实现
    Python日志分级记录到不同文件的实现介绍如何使用Python的logging模块,按INFO、WARNING和ERROR级别将日志记录到不同的文件中。通过封装CustomLogger类,方便在项目中直接调用,简化日志管理。1.实现目标分级日志记录:将INFO、WARNING、ERROR级别的日志分别记录到不......
  • python球探数据分析
    Python球探数据分析入门指南作为一名刚入行的小白,你可能会对如何使用Python进行球探数据分析感到困惑。不用担心,这篇文章将为你提供一份详细的入门指南,帮助你逐步掌握这项技能。流程概览首先,让我们通过一个表格来了解整个数据分析的流程:步骤描述1获取数据2数据......
  • Leetcode刷题Python之3254.长度为K的子数组的能量值I
    提示:关于数组子问题的挑战,涉及能量值的计算。文章目录一、问题描述示例二、解题思路三、代码实现1.引入库2.代码解释总结一、问题描述给定一个长度为n的整数数组nums和一个正整数k,我们需要计算每个长度为k的子数组的能量值。能量值的定义如下:如果子数......