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

python【类和面向对象】

1. 概念

面向对象(OOP)是一种对现实世界理解和抽象的方法,对象的含义是指在现实生活中能够看得见摸得着的任何具体事物。Python 是一门面向对象的语言,面向对象编程简单来说就是一种封装代码的方式。

  • 类(Class): 描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法,简单来说就是一个模板,通它来创建对象。对象是类的实例。
  • 实例化:创建一个类的实例,即类的具体对象。
  • 对象:通过类定义的数据结构实例,包括两个数据成员(类变量和实例变量)方法
  • 方法:类中定义的函数。
  • 类变量:类变量在整个实例化的对象中是公用的,它定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 局部变量:方法中定义的变量,只作用于当前实例。
  • 实例变量:在类的声明中,用来表示属性的变量,实例变量就是一个用 self 修饰的变量。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称方法的重写。

面型对象的三大特征

【封装】

面型对象编程的核心思想,将对象的属性和行为封装起来,其载体是。类会隐藏对象的属性和实现细节,仅对外提供公共访问方式,避免外部数据对内部数据结构的影响,保证类的内部数据结构的完整性,又提高复用性、可维护性和安全性。

【继承】

继承是实现重复利用的重要手段,派生类继承基类的字段和方法,也可以添加自己特有的属性和行为。继承允许把派生类对象作为基类对象对待。

【多态】

将父类对象应用于子类特征就是多态,即父类定义的引用变量可以指向子类的实例对象,子类继承父类特征的同时,也具备自己的特征,能够实现不同的效果,提高了程序的拓展性。


2. 类的定义和使用

2.1 定义类

语法结构

class 类名:
    属性
    ...
    方法
    ...

# 定义一个简单的类
class MyClass:i = 12345def hw(self):return 'hello world'

 

2.2 创建类的实例:实例化类对象

python中创造实例不使用 new。当创建一个类时,没有创建 __init__() 方法或当 __init__() 方法只有一个 self 参数时,可以省略可选参数。

语法格式

实例名 = 类名(可选参数)

# 实例化类
helloWorld = MyClass()
  • 类创建后,类通常会自动创建一个特殊的 __init__() 方法,和 Java 相似,每当创建一个类的新实例,python 都会自动执行它。
  • __init__() 方法必须包含一个 self 参数,而且必须是第一个参数。类的方法与普通的函数只有一个特别的区别,它们必须有一个额外的第一个参数名称 self,self 是指向实例本身的引用,代表当前对象的地址,用于访问类中的属性和方法,在方法调用时会自动传递实际参数 self。
  • 类对象创建后,类命名空间中所有的命名都是有效属性名。

 __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上:

class Cat:# 属性color = 'black'# 构造方法def __init__(self, name):self.name = name# 自定义方法def eat(self, food):self.food = foodprint(self.name, '正在吃'+food)

 

2.3 创建类成员并访问

类创建好后,我们可以直接通过类名访问属性。

语法格式

类名.属性名 / 方法名

# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())

【访问限制】

在类的内部可以定义属性和方法,在类的外部可以直接调用属性和方法来作操作数据。为了保证类内部的某些属性不被外界访问,可以在属性或方法名前添加:

  • 单下划线:表示 protected 成员,只允许类本身和子类访问,不能使用 “from module import *” 导入。保护属性可通过实例名访问。
  • 双下划线:表示 private 成员,只允许定义该方法的类本身访问,不能通过类的实例名访问,但可以通过 “实例名.类名 __xxx” 访问。
  • 首尾双下划线:特殊方法,一般是系统定义的。

2.4 类的专有方法

__init__  

构造函数,在生成对象时调用
__del__析构函数,释放对象时使用
__repr__ 打印,转换
__setitem__按照索引赋值
__getitem__按照索引获取值
__len__获得长度
__cmp__比较运算
__call__函数调用
__add__加运算
__sub__减运算
__mul__乘运算
__truediv__除运算
__mod__求余运算
__pow__乘方

2.5 继承

Python 支持类的继承,而且支持多继承:

语法格式

class 子类(基类1, 基类2 ...):
    ...

基类名必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:

class 子类名(模块名.基类名):

#类定义
class people:#定义基本属性name = ''age = 0#定义私有属性,私有属性在类外部无法直接进行访问__weight = 0#定义构造方法def __init__(self,n,a,w):self.name = nself.age = aself.__weight = wdef speak(self):print("%s 说: 我 %d 岁。" %(self.name,self.age))#单继承示例
class student(people):grade = ''def __init__(self,n,a,w,g):#调用父类的构函people.__init__(self,n,a,w)self.grade = g#覆写父类的方法def speak(self):print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))#另一个类,多继承之前的准备
class speaker():topic = ''name = ''def __init__(self,n,t):self.name = nself.topic = tdef speak(self):print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))#多继承
class sample(speaker,student):a =''def __init__(self,n,a,w,g,t):student.__init__(self,n,a,w,g)speaker.__init__(self,n,t)test = sample("Tim",25,80,4,"Python")
test.speak()   #方法名同,默认调用的是在括号中参数位置排前父类的方法


3. 特殊属性

python 有一种属性,访问它时将计算它的值,该属性还可以为其他属性添加安全保护机制。

3.1 创建用于计算的属性

通过 @property(装饰器) 将一个方法转为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要添加 ()。

语法格式

@property

def 方法名(self):

    方法体

3.2 为属性添加安全保护机制

默认情况,创建的类属性或实例名是可以在类体外进行修改的,如果想要限制其不能在类体外修改,可以将其设为私有的,但是设为私有后,在体外也不能获取它的值。而使用 @property 可以实现只读属性。

语法格式

@property

def 方法名(self):

    方法体


4. 方法重写

派生类中定义 __init__() 方法时,不会自动调用基类的 __init__() 方法。因此要在派生类中使用基类 __init__() 方法,必须要进行初始化,需要在派生类中使用 super() 函数调用基类的 __init__() 方法。

class Parent:        # 定义父类def myMethod(self):print ('调用父类方法')class Child(Parent): # 定义子类def myMethod(self):print ('调用子类方法')c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法

【运算符重载】

class Vector:def __init__(self, a, b):self.a = aself.b = bdef __str__(self):return 'Vector (%d, %d)' % (self.a, self.b)def __add__(self,other):return Vector(self.a + other.a, self.b + other.b)v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)


http://www.mrgr.cn/news/53958.html

相关文章:

  • ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)
  • 火山引擎数智平台 VeDI:A/B 实验互斥域流量分配体系上线
  • 排序02 Multi-gate Mixture-of-Experts (MMoE)
  • C/C++ 每日一练:单链表的反转
  • 【Python网络编程】学习Socket编程,打造网络应用!
  • 来自骨关节炎计划的膝关节MR图像的自动异常感知3D骨骼和软骨分割|文献速递-基于生成模型的数据增强与疾病监测应用
  • 基于卡尔曼滤波算法处理感知车道线系数
  • 用实例来理解Java中的类和对象
  • stable diffusion 大模型及lora等下载安装使用教程及项目目录说明
  • ⌈ 传知代码 ⌋ 视频质量评价SimpleVQA
  • 代码训练营 day39|0-1背包问题,LeetCode 416
  • 基于语音识别的停车共享小程序(lw+演示+源码+运行)
  • setuptools封装自己python包
  • 图像梯度-Sobel算子、scharrx算子和lapkacian算子
  • 逆向工程入门02.if语句分析
  • 如何用联想电脑滚动截图
  • stablediffusion ControlNet选不了模型/报错/无效 的解决方法
  • 【Linux网络编程】Socket编程--UDP(第一弹):实现客户端和服务器互相发送消息
  • 14.归一化——关键的数据预处理方法
  • 【C++ 算法进阶】算法提升四
  • 【C++训练营】现代C++编程(隐藏)
  • 【Mysql】-锁机制-GAP锁
  • 2024年【N2观光车和观光列车司机】及N2观光车和观光列车司机模拟考试题
  • 【Hive】2-Apache Hive概述、架构、组件、数据模型
  • 好的口才是做领导的第一要务
  • SpringMVC一个拦截器和文件上传下载的完整程序代码示例以及IDEA2024部署报错 找不到此 Web 模块的 out\artifacts\..问题