当前位置: 首页 > news >正文

【10.2 python中的类的定义和使用】

python中的类的定义和使用


下面将详细介绍Python中类的定义和使用,包括定义类、创建类的实例、创建__init__()方法、创建类的成员并访问它们,以及访问限制等。

1. 定义类

在Python中,定义类使用class关键字后跟类名。类体中的代码块(通过缩进来定义)可以包含方法定义和变量赋值(这些变量称为类属性,但通常用于定义静态变量或常量,而不是实例属性)。

class MyClass:# 类属性(静态变量或常量)class_attribute = "I'm a class attribute"# 构造函数,用于初始化实例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."

2. 创建类的实例

创建了类之后,你可以通过类名后跟圆括号(可以包含传递给__init__()方法的参数)来创建类的实例(对象)。

my_instance = MyClass("Alice", 30)

3. 创建__init__()方法

__init__()方法是一个特殊的方法,称为类的构造函数或初始化方法。当创建类的新实例时,Python会自动调用这个方法。self参数是对实例自身的引用,用于访问类的属性和其他方法。

def __init__(self, name, age):self.name = name  # 创建实例属性nameself.age = age    # 创建实例属性age

4. 创建类的成员并访问

类的成员可以是属性(变量)或方法(函数)。属性可以是实例属性(属于类的每个实例)或类属性(属于类本身,所有实例共享)。

  • 访问实例属性:通过实例名和点号(.)后跟属性名来访问。

    print(my_instance.name)  # 输出: Alice
    print(my_instance.age)   # 输出: 30
    
  • 访问类属性:通过类名和点号(.)后跟属性名来访问。但请注意,通过实例也可以访问类属性,但这通常不是最佳实践。

    print(MyClass.class_attribute)  # 输出: I'm a class attribute
    print(my_instance.class_attribute)  # 也可以通过实例访问,但不建议这样做
    
  • 调用方法:通过实例名和点号(.)后跟方法名来调用。

    print(my_instance.greet())  # 输出: Hello, my name is Alice and I am 30 years old.
    

5. 访问限制

Python没有像某些其他语言(如Java)那样的严格访问控制关键字(如publicprivateprotected)。但是,Python社区有一个约定俗成的规则,即使用单下划线(_)前缀表示受保护的成员(即不建议从类的外部直接访问),使用双下划线(__)前缀表示私有成员(即Python会对其进行名称改写,以避免子类中的命名冲突)。

class MyClass:def __init__(self, name):self._protected_attribute = name  # 受保护的属性self.__private_attribute = "Private"  # 私有属性# 注意:虽然可以定义私有方法,但通常不推荐这样做,因为Python不是基于访问修饰符的语言def __private_method(self):return "This is a private method."# 尝试访问私有和受保护的成员将导致错误或警告(尽管私有成员在内部可以通过_ClassName__private_attribute的形式访问)
# print(my_instance._protected_attribute)  # 正确,但不推荐从外部访问
# print(my_instance.__private_attribute)  # 错误,直接访问会抛出AttributeError

然而,需要注意的是,Python的私有成员(双下划线前缀)并不是真正的私有,而是一种命名约定加上Python的名称改写机制(name mangling)。因此,从技术上讲,仍然可以通过特定的方式(使用_ClassName__attribute_name的形式)访问这些“私有”成员,但这并不符合Python的社区规范和最佳实践。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SQL进阶技巧:最近有效的缺失值填充问题【last_value实现版】
  • 基于WebSocket打造的一款SSH客户端
  • iLogtail 开源两周年:感恩遇见,畅想未来
  • 《中国档案》
  • 前端调用后端,出现跨域报错怎么办
  • GATK AlleleList接口介绍
  • SpringBoot3 简单集成 Spring AI 并使用
  • 图的应用
  • 使用 Python 绘制词云图的详细教程
  • SpringBoot的异常java.lang.ClassNotFoundException: io.r2dbc.spi.ValidationDepth
  • 【算法基础实验】图论-最小生成树-Prim的即时实现
  • Java学习笔记(01)final关键字的使用
  • 【论文阅读】通用的语义-几何表征的机器人操作
  • EmguCV学习笔记 VB.Net 第6章 形状操作
  • K8S 版本发版
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • Android优雅地处理按钮重复点击
  • Asm.js的简单介绍
  • co.js - 让异步代码同步化
  • create-react-app做的留言板
  • css的样式优先级
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Java精华积累:初学者都应该搞懂的问题
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • text-decoration与color属性
  • ubuntu 下nginx安装 并支持https协议
  • 阿里研究院入选中国企业智库系统影响力榜
  • 程序员最讨厌的9句话,你可有补充?
  • 学习JavaScript数据结构与算法 — 树
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 怎样选择前端框架
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #QT(QCharts绘制曲线)
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (9)目标检测_SSD的原理
  • (k8s中)docker netty OOM问题记录
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (转)创业家杂志:UCWEB天使第一步
  • (转)德国人的记事本
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .net core Swagger 过滤部分Api
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • @ConfigurationProperties注解对数据的自动封装
  • @EnableWebSecurity 注解的用途及适用场景
  • @JsonFormat与@DateTimeFormat注解的使用
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [C++] new和delete
  • [C++][基础]1_变量、常量和基本类型