Python 类的使用

news2025/1/11 7:57:19

目录

1、类的基本概念

1.1、类的定义

1.2、类的使用

2、类的公有属性和私有属性

2.1、为什么子类不能访问父类的私有属性/方法?

3、实例方法、类方法、静态方法

3.1、实例方法

3.2、类方法

3.3、静态方法

4、@property 、@XXX.setter和@XXX.deleter的使用

4.1、@property

4.2、@XXX.setter

4.3、@XXX.deleter

1、类的基本概念

基本概念:在Python中,类(Class)是创建对象(Object)的蓝图或模板。它定义了对象的属性(Attributes)和方法(Methods)。属性是类中定义的变量,用于存储数据;方法是类中定义的函数,用于执行操作。

1.1、类的定义

类的定义使用关键字class,后跟类名和类体。类体中可以包含属性(通常作为初始化方法__init__的参数)和方法(定义为类中的函数)。

class MyClass:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
  
    def greet(self):  
        return f"Hello, my name is {self.name} and I am {self.age} years old."

在这个例子中,MyClass是一个简单的类,它有两个属性:nameage,以及一个方法:greet__init__是一个特殊的方法,称为类的构造函数或初始化方法,用于在创建对象时初始化属性。

1.2、类的使用

要使用类,你需要创建类的实例,这通常通过调用类名并传入必要的参数来完成。

# 创建MyClass的一个实例  
person = MyClass(name="Alice", age=30)  
  
# 访问属性  
print(person.name)  # 输出: Alice  
print(person.age)   # 输出: 30  
  
# 调用方法  
print(person.greet())  # 输出: Hello, my name is Alice and I am 30 years old.

在这个例子中,我们创建了MyClass的一个实例person,并通过传入nameage参数来初始化它的属性。然后,我们访问了这些属性并调用了greet方法。

2、类的公有属性和私有属性

类的公有属性:

  • 命名:普通属性的定义可以在属性前面加上单下划线_;
  • 可见性:公有属性在类的内部和外部都是可见的。这意味着,无论是在类的定义中,还是在类的实例化对象上,公有属性都可以被识别;
  • 可访问性:公有属性不仅可见,而且可以在类的内部和外部被直接访问和修改。这是公有属性与私有属性和受保护属性的主要区别之一。

类的私有属性:

  • 命名:在属性名和方法名 前面 加上双下划线 __;
  • 访问:都不能通过对象直接访问,但是可以在本类内部访问,可以设置方法为外部的访问提供入口;
  • 继承:不会被子类继承,子类也无法访问;
  • 内部实现原理:Python实际上并没有真正的私有属性。当在类定义中使用双下划线前缀定义属性时,Python会在内部将属性名修改为以类名和两个下划线为前缀的形式(例如,_ClassName__attributeName)。然而,这种重命名机制主要是作为一种命名约定来提示开发者不要直接访问这些属性,而不是强制的访问限制。因此,理论上仍然可以通过这种重命名后的属性名来访问私有属性,但这通常是不被推荐的做法。

示例:

class Parent:

    _name = 'hello' # 公有属性
    def __init__(self, age):
        self.__age = age # 私有属性

    def __private(self):  #私有方法
        print('this is private function')

class Child(Parent):
    def name(self):
        print(f'name: {self._name!r}')

    def get_age(self):
        # 采用此方法是可以访问父类的私有属性
        # return self._Parent__age
        # 采用对象直接访问父类的私有属性是无法访问的
        return self.__age

    def get_private(self):
        # 可以通过此方式访问父类的私有方法
        self._Parent__private()

child = Child(10)
print(child._Parent__age) # 子对象访问父对象的私有属性

child.name()
child.get_private()  # 子对象访问父对象的私有方法
print(child.__dict__) # 查看该对象的属性字典
# child.get_age() # 'Child' object has no attribute '_Child__value'

a = Parent('hello')
a._Parent__private() # 父对象访问自己的私有方法
print(a.__dict__) # 查看该对象的属性字典

2.1、为什么子类不能访问父类的私有属性/方法?

先看下面的示例:

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

class Child(Parent):
    def get_age(self):
        # 采用此方法是可以访问父类的私有属性
        # return self._Parent__age
        # 采用对象直接访问父类的私有属性是无法访问的
        return self.__age

child = Child(10)
print(child._Parent__age) # 子对象访问父对象的私有属性
child.get_age() # 'Child' object has no attribute '_Child__value'

运行结果如下:

分析:

  • 因为python会对类的私有属性做些转换,以保证private字段的私密性。当编译器看到Child.get_value方法要访问私有属性时,它会先把__value变换为_Child_value然后再进行访问,但实际上该私有属性是_Parent__value。所以子类无法访问父类的私有属性,只是因为访问的名称不同。

3、实例方法、类方法、静态方法

实例方法:只有实例对象才能调用的实例方法

类方法:类方法就是Python类的方法,是这个类可以调用的方法,那么参数需要把这个类本身传进去(必须传的,一般写为cls),不需要实例化就可以使用。

静态方法:静态方法是类中的一个独立的普通函数或者说方法,那么参数和普通函数的传参一样,想怎么传就怎么传,类或者实例化的对象都可以直接使用它,也就是说这个静态方法不需要实例化就可以调用。

3.1、实例方法

定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法)。

调用:只能由实例对象调用。可继承

示例:

# 实例方法
class A():

    def __init__(self):
        self.name = 'hello'

    def test(self):
        print('this is test')

A().test()  # 只能由实例化对象才能调用

3.2、类方法

定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法)

调用:实例对象和类对象都可以调用;可继承

使用场景:

  • 工厂方法:类方法可以用作工厂方法,根据输入参数返回类的不同实例。
  • 类属性管理:类方法可以用于管理或访问类属性。

示例

以下是一个简单的示例,演示了如何使用类方法来管理一个类属性(计数器),该属性跟踪已创建的类实例数量。

class MyClass:  
    _instances = 0  # 类属性,用于跟踪实例数量  
  
    def __init__(self):  
        MyClass._instances += 1  # 每次创建实例时,增加计数器  
  
    @classmethod  
    def get_instances_count(cls):  
        # 类方法,用于获取当前实例数量  
        return cls._instances  
  
# 创建MyClass的实例  
instance1 = MyClass()  
instance2 = MyClass()  
  
# 使用类方法获取实例数量  
print(MyClass.get_instances_count())  # 输出: 2

3.3、静态方法

定义:使用装饰器@staticmethod。 静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。

示例:

class MathUtilities:  
    @staticmethod  
    def add_numbers(a, b):  
        return a + b  
  
    @staticmethod  
    def multiply_numbers(a, b):  
        return a * b  
  
# 使用静态方法  
print(MathUtilities.add_numbers(5, 10))  # 输出: 15  
print(MathUtilities.multiply_numbers(5, 10))  # 输出: 50

4、@property 、@XXX.setter和@XXX.deleter的使用

4.1、@property

作用:

1、让函数可以像普通变量一样使用,将方法转换为相同名称的只读属性

2、创建只读属性,防止属性被修改

3、对要读取的数据进行预处理

示例:

class MyClass:
    def __init__(self, value):
        self._value = value

    @property
    def value(self):
        """获取属性值"""
        return self._value

obj = MyClass(10)
print(obj.value)  # 输出: 10

4.2、@XXX.setter

1、@*.setter装饰器必须在@property装饰器的后面,且两个被修饰的函数的名称必须保持一致,* 即为函数名称。

2、只要两个装饰器成对出现,两个装饰器下的函数名必须相同,以此表示同一个属性的可读可写,如果只有@property出现则表示只读;

3、@*.setter不能单独出现

示例:

class MyClass:
    def __init__(self, value):
        self._value = value

    @property
    def value(self):
        """获取属性值"""
        return self._value

    @value.setter
    def value(self, new_value):
        """设置属性值"""
        self._value = new_value

obj.value = 20  # 设置新的值
print(obj.value)  # 输出: 20

4.3、@XXX.deleter

1、@*.deleter装饰器必须在@property装饰器的后面,且两个被修饰的函数的名称必须保持一致,* 即为函数名称。

2、只要两个装饰器成对出现,两个装饰器下的函数名必须相同,以此表示同一个属性的可读可s删除,如果只有@property出现则表示只读;

3、@*.deleter不能单独出现

示例:

class MyClass:
    def __init__(self, value):
        self._value = value

    @property
    def value(self):
        """获取属性值"""
        return self._value

    @value.setter
    def value(self, new_value):
        """设置属性值"""
        self._value = new_value

    @value.deleter
    def value(self):
        """删除属性值"""
        del self._value

obj = MyClass(10)
print(obj.value)  # 输出: 10
obj.value = 20  # 设置新的值
print(obj.value)  # 输出: 20
del obj.value  # 删除属性
# 尝试再次访问会导致错误,因为属性已经被删除
# del obj.value  # AttributeError: _value

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2040492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

20240814确认RK3588S接USB摄像头录像+预览出现异常

20240814确认RK3588S接USB摄像头录像预览出现异常 2024/8/14 21:03 缘起,使用荣品RK3588S-AHD开发板接USB摄像头预览【几分钟】正常。 但是只要一开始录像预览就异常。 于是,上Rockchip的官方RK3588S开发板。预览52分钟还是出错了。 录像预览也异常。 但…

【IO day8】

第一题: 由于共享内存没有同步,想办法搞定共享内存的同步问题 p1.c p2.c 第二题: 使用第一题作用已经实现的共享内存,去做2个终端之间的互相聊天 t1.c t2.c

C语言 | Leetcode C语言题解之第335题路径交叉

题目&#xff1a; 题解&#xff1a; bool isSelfCrossing(int* distance, int distanceSize){if (distance NULL || distanceSize < 4) {return false;}for (int i 3; i < distanceSize; i) {if ((distance[i] > distance[i - 2]) && (distance[i - 1] &l…

临床数据科学和金融数据科学,选择R语言吧!

学习R语言不仅能够增强数据分析能力&#xff0c;还能开拓解决复杂问题的新方法。然而&#xff0c;在学习R语言的过程中&#xff0c;许多初学者会遇到各种陷阱&#xff0c;这些陷阱不仅会延缓学习进度&#xff0c;还可能导致学习动机的丧失。 下面内容摘录自《R 语言与数据科学的…

814的学习

共享内存实现

【谷粒商城学习笔记】项目介绍+分布式基础概念

文章目录 电商模式项目技术特色项目前置要求分布式基础概念微服务集群/分布式/节点远程调用负载均衡服务发现、注册中心配置中心服务熔断、降级网关 微服务架构图微服务划分图文章说明 电商模式 市面上有 5 种常见的电商模式 B2B、B2C、C2B、C2C、O2O。 B2B 模式&#xff1a;…

SAP与网易大数据系统集成案例

一、项目环境 江西某药业有限公司是一家以医药产业为主营、资本经营为平台的大型民营企业集团。公司成立迄今&#xff0c;企业经营一直呈现稳健、快速发展的态势集团总销售额超40亿元。 为了帮助企业更有效的进行分配和管理&#xff0c;包括人力、物资、时间和预算等资源&a…

Redis的简单介绍

一、Redis简介 1.NOSQL NoSQL( Not Only SQL)&#xff0c;意即“不仅仅是SQL”&#xff0c;泛指非关系型的数据库。随着互联网web2.0网站的兴起&#xff0c;传统的关系数据库在应付web2.0网站&#xff0c;纯动态网站已经显得力不从心&#xff0c;暴露了很多难以克服的问题&am…

DNS的反向解析

反向解析 DNS的反向解析&#xff08;Reverse DNS Lookup&#xff0c;通常缩写为rDNS&#xff09;是指通过IP地址查找与之对应的域名的过程。与正向解析&#xff08;通过域名查找IP地址&#xff09;相对&#xff0c;反向解析的主要用途是验证IP地址与域名的关联性&#xff0c;常…

调用本地大模型API 以ollama为例子 技术栈node.js koa2 vite

首先在官方下载ollama大模型 https://ollama.com/ 在cmd中查看版本 ollama -v 看到有版本号&#xff0c;说明安装完成。 下载合适的大模型 运行内存16g 建议 7b 左右的大模型&#xff0c;16g以上自己合理安排 点击官网模型下载合适的大模型 复制粘贴到cmd中 下载完成后 ollama …

学习嵌入式入门(十一)电容触摸实验及OLED 显示实验

一、电容触摸实验 1.电容触摸按键简介 电容式触摸按键已经广泛应用在家用电器、消费电子市场&#xff0c;其主要优势有&#xff1a;无机械装置&#xff0c; 使用寿命长&#xff1b;非接触式感应&#xff0c;面板不需要开孔&#xff1b;产品更加美观简洁&#xff1b;防水可以做…

【教程】Ubuntu给pycharm添加侧边栏快捷方式

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm&#xff0c;其他软件也是一样操作 1、进入到pycharm的目录&#xff0c;先通过命令行打开pycharm&#xff1a; ./bin/pycharm…

Vscode——如何实现 Ctrl+鼠标左键 跳转函数内部的方法

一、对于Python代码 安装python插件即可实现 二、对于C/C代码 安装C/C插件即可实现

LATTICE进阶篇DDR2--(4)DDR2 IP核总结

一、IP核的时钟框架 1片DDR2的接口是16位&#xff0c;且DDR2是双边沿读取的&#xff0c; 故当DDR2芯片的时钟为200M时&#xff0c;右侧DDR2芯片上的数据吞吐率为200M*2*16b&#xff0c;左侧数据吞吐率为200M*32b&#xff0c;左右两侧数据吞吐量相等。 根据上规律可知&#xf…

Java Spring|day2.SpringMVC

Spring MVC 定义 MVC是一种设计模式&#xff0c;在这种模式下软件被分为三层&#xff0c;即Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09;。 MVC是一种软件架构思想&#xff0c;把软件按照模型&#xff…

CSS设置文本超出显示省略号

一、单行文本显示省略号 <div class"box"><p>测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本…

用于不平衡医疗数据分类的主动SMOTE

一、主动学习如何应用于不平衡数据的处理 首先&#xff0c;主动SMOTE不是像经典的SMOTE那样从训练集中随机选择一个样本作为生成合成样本的轴心点&#xff0c;而是通过不确定性和多样性采样来智能地进行样本选择&#xff0c;这是主动学习的两种技术。 在数据不平衡的情况下&…

2024.8完善版 NineAi-ChatGPT系统源码

Nine AI.ChatGPT是基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代…

Vue2中watch与Vue3中watch对比

上一节说到了 computed计算属性对比 &#xff0c;虽然计算属性在大多数情况下更合适&#xff0c;但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法&#xff0c;来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时&#…

【策略模式】设计模式系列:在Java中实现灵活的行为选择(实战指南)

文章目录 策略模式&#xff1a;在Java中实现灵活的行为选择引言1. 策略模式的组成1.1 抽象策略 (Strategy)1.2 具体策略 (Concrete Strategy)1.3 上下文 (Context)1.4 UML类图和时序图 2. 策略模式在Java中的实现步骤一&#xff1a;定义抽象策略接口步骤二&#xff1a;创建具体…