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

python两大编程思想,类和对象,实例变量类变量,静态方法与实例方法和类方法,给对象动态绑定属性和函数

1.两大编程思想

面向对象(python和java)和面向过程(c语言)编程思想的区别

在这里插入图片描述

2.类和对象

1.类是抽出对象中的相似属性和行为得到的类别

python中一切皆对象

在这里插入图片描述

对于字符串,整数等等都是类型class

可以自定义class,需要注意类型名称首字母大写

2.创建类,创建对象结构:
在这里插入图片描述
类的组成:
在这里插入图片描述
实例属性和实例方法的调用需要用对象名.来调用,其他和实例无关的类的相关组成通过类名来调用

  • 类属性
    类属性是定义在类命名空间中的变量,它被类的所有实例共享。这意味着,无论你创建了多少个类的实例,它们访问的都是同一个类属性。类属性通常用于那些与类本身紧密相关,但与类的具体实例无关的数据。
  • 实例属性 实例属性是定义在实例命名空间中的变量,每个实例都有自己独立的实例属性,互不干扰。实例属性通常用于存储与类的特定实例相关的数据。
  • 定义实例属性
    实例属性通常在类的__init__方法中定义,使用self作为前缀。
class MyClass:  # 类属性  class_attribute = "这是一个类属性"  def __init__(self, instance_attribute):  #实例方法# 实例属性  self.instance_attribute = instance_attribute  # 访问类属性  
print(MyClass.class_attribute)  # 输出: 这是一个类属性  # 修改类属性(会影响所有实例)  
MyClass.class_attribute = "类属性已修改"  
print(MyClass.class_attribute)  # 输出: 类属性已修改 # 创建实例  
instance1 = MyClass("实例属性1")  
instance2 = MyClass("实例属性2")  # 访问实例属性  
print(instance1.instance_attribute)  # 输出: 实例属性1  
print(instance2.instance_attribute)  # 输出: 实例属性2  # 修改实例属性(不会影响其他实例)  
instance1.instance_attribute = "实例属性1已修改"  
print(instance1.instance_attribute)  # 输出: 实例属性1已修改  
print(instance2.instance_attribute)  # 输出: 实例属性2(未变)

总结
类属性:定义在类命名空间中,被类的所有实例共享
实例属性:定义在实例命名空间中,每个实例都有自己独立的实例属性

  • 实例方法

实例方法通过在类定义中直接编写函数来定义,但该函数至少接受一个名为self的参数(虽然在调用实例方法时不需要显式传递self参数,Python会自动处理)。

在下边这个例子中,__init__方法是一个特殊的实例方法,用于初始化新创建的实例。它自动接受self作为第一个参数,尽管在创建实例时不需要显式传递它。

class MyClass:  def __init__(self, value):  self.value = value  def print_value(self):  # 访问实例属性  print(self.value)  def modify_value(self, new_value):  # 修改实例属性  self.value = new_value  # 创建实例  
instance = MyClass(5)  # 调用实例方法  
instance.print_value()  # 输出: 5  
instance.modify_value(10)  
instance.print_value()  # 输出: 10
  • 静态方法

在Python中,静态方法(Static Methods)是定义在类中的函数,但它既不接受类隐式的第一个参数(cls对于类方法而言),也不接受实例隐式的第一个参数(self对于实例方法而言)。静态方法实际上与普通函数的行为相似,但它们在类的命名空间中定义,这意味着你可以通过类来引用它们,而不是必须定义在全局作用域中。

静态方法主要用于那些逻辑上属于类的范畴,但实际上既不需要访问类属性也不需要访问实例属性的函数。

静态方法通过@staticmethod装饰器来定义。

class MyClass:  @staticmethod  def my_static_method(arg1, arg2):  # 注意:没有self或cls参数  print(f"Static method called with arguments: {arg1}, {arg2}")  # 调用静态方法  
MyClass.my_static_method(1, 2)  # 通过类名调用  # 也可以通过实例调用,但这样做通常不是必需的  
instance = MyClass()  
instance.my_static_method(3, 4)  # 通过实例调用

使用场景:

静态方法的一个常见用途是实现工具函数,这些函数虽然与类紧密相关,但不需要访问类的任何属性。例如,你可能有一个表示几何形状的类,该类有一个静态方法来计算给定类型的形状是否可以被另一个形状完全包含(如一个圆是否完全位于另一个圆内)。这样的计算不需要访问任何实例或类属性,因此将其实现为静态方法是合适的。

  • 类方法

在Python中,类方法(Class Methods)是绑定到类而不是类的实例的方法。它们至少接受一个参数,按照惯例,这个参数被命名为cls,它是对类本身的引用,而不是类的实例。类方法通过@classmethod装饰器来定义。

**类方法通常用于实现那些需要访问类属性或执行与类本身相关的操作,但不需要访问或修改实例属性的功能。**一个常见用途是实现工厂方法模式,即类方法根据输入参数返回类的不同实例。另一个用途是修改或访问类级别的状态。

class MyClass:  counter = 0  # 类属性  @classmethod  def get_counter(cls):  # 注意:这里使用cls而不是self  return cls.counter  

静态方法与实例方法和类方法的区别
实例方法:接受一个隐式的self参数,通过该参数可以访问类的实例属性和其他实例方法。
类方法:接受一个隐式的cls参数,代表类本身,通过它可以访问类属性,但不能直接访问实例属性(因为没有self参数指向具体的实例)。
静态方法:不接受隐式的self或cls参数,它更像是一个放在类命名空间中的普通函数。

给对象动态绑定属性和函数

在对象创建后再写入
动态函数写好后赋值给对象,需要注意不要加()错写成调用。
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 老外说“You‘re a fat cat”是什么意思?你是只肥猫?错得离谱!柯桥学英语口语到银泰广场
  • 团结引擎发布1.2.3版本更新
  • zdpgo_cobra_req 新增解析请求体内容
  • 电脑屏幕录制指南,2024四大免费录屏软件推荐!
  • 猫头虎 分享已解决Bug || ImportError: No module named ‘django‘ 解决方案
  • 配置ssh密钥登录Redhat Linux(Putty,xshell)
  • 数据库管理-Redis
  • VS2022 C++ EasyX EGE 吃豆人升级版
  • 白骑士的Matlab教学进阶篇 2.5 Simulink
  • C语言 ——— 在杨氏矩阵中查找具体的某个数
  • IT管理:我与IT的故事1--努力是成功的序曲
  • Redis缓存配置
  • 大数据治理平台建设与应用解决方案(41页PPT)
  • JAVA解压文件到目标目录
  • Nginx系列-负载均衡
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • HTTP请求重发
  • Iterator 和 for...of 循环
  • jquery cookie
  • linux学习笔记
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • spring-boot List转Page
  • TCP拥塞控制
  • webpack项目中使用grunt监听文件变动自动打包编译
  • Web设计流程优化:网页效果图设计新思路
  • 编写符合Python风格的对象
  • 创建一个Struts2项目maven 方式
  • 判断客户端类型,Android,iOS,PC
  • 普通函数和构造函数的区别
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #{}和${}的区别是什么 -- java面试
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (MATLAB)第五章-矩阵运算
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)linux下的时间函数使用
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .Mobi域名介绍
  • .net FrameWork简介,数组,枚举
  • .net mvc部分视图
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [2024-06]-[大模型]-[Ollama]- WebUI
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布