面向对象基本概念 您所在的位置:网站首页 类的实例方法表示的是 面向对象基本概念

面向对象基本概念

2024-06-12 04:19| 来源: 网络整理| 查看: 265

面向对象基本概念

面向对象程序设计(Object Oriented Programming,OOP)主要针对大型软件设计而提出,使得软件设计更加灵活,能够很好地支持代码复用和设计复用,并且使得代码具有更好的可读性和可扩展性。

在现实世界中存在各种不同形态的事物,这些事物之间存在着各种各样的联系。面向对象思想,模拟了人类认识客观世界的逻辑,在程序中使用对象来映射现实中的事物,使用对象间的关系来描述事物之间的联系,这种思想就是面向对象。

1、面向过程和面向对象 面相过程 —— 怎么做?

面向过程只考虑如何解决当前问题,它着眼于问题本身。

分析解决问题的步骤(操作流程)使用函数实现步骤相应的功能(函数的封装)按照步骤的先后顺序依次调用函数 特点 注重步骤与过程,不注重职责分工,如果需求复杂,代码会变得很复杂,开发复杂项目,没有固定的套路,开发难度很大! 面向对象 —— 谁来做? 首先会从问题之中提炼出问题涉及的角色;将不同角色各自的特征和关系进行封装;以角色为主体,通过描述角色的行为去描述解决问题的过程。 特点 注重对象和职责,不同的对象承担不同的职责更加适合应对复杂的需求变化,是专门应对复杂项目开发,提供的固定套路 2、类和对象的概念

类 类是对一群具有相同特征或者行为的事物的一个统称,是抽象的,不能直接使用。 特征 被称为 属性 行为 被称为 方法 类就相当于是一个模板,是负责创建对象的

对象 对象是由类创建出来的一个具体存在,可以直接使用; 由哪一个类创建出来的对象,就拥有在哪一个类中定义的:属性和方法; 在程序开发中,应该先有类,再有对象。

3、面向对象程序设计的三大特征:封装、继承和多态

封装(encapsulation) 封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节,这就是封装思想。

继承(inheritance) 继承描述的是类与类之间的关系,通过继承,新生类可以在无需赘写原有类的情况下,对原有类的功能进行扩展。

多态(polymorphism) 是指基类的同一个方法在不同派生类对象中具有不同的表现和行为。派生类继承了基类行为和属性之后,还会增加某些特定的行为和属性,同时还可能会对继承来的某些行为进行一定的改变,这都是多态的表现形式。

类的定义与使用

1、类定义语法

class 类名: 属性名 = 属性值 def 方法名(self): 方法体

注意:

类名的首字母一般要大写,满足大驼峰命名法;创建类时用变量形式表示的对象属性称为数据成员,用于描述对象特征;用函数形式表示的对象行为称为成员方法,用于描述对象行为。 2、self 参数

类的所有实例方法都必须至少有一个名为self的参数,并且必须是方法的第一个形参(如果有多个形参的话),self参数代表将来要创建的对象本身。

在类的实例方法中访问实例属性时需要以self为前缀。

在外部通过对象名调用对象方法时并不需要传递这个参数。Python解释器会把这个对象本身作为第1个参数传给self,开发者只需要传递后面的参数就可以了。

如果在外部通过类名调用对象方法则需要显式为self参数传值。

# 类的定义 class Car: def __init__(self,newColor): self.color = newColor def infor(self): print("这个颜色为:%s"% self.color) c = Car("白色") #用类名Car创建对象时,会自动调用__init__()方法 c.infor() #对象名调用对象方法 Car.infor(c) #通过类名调用实例方法 print(c) #对象的地址 # 内置方法 isinstance() 来测试一个对象是否为某个类的实例。 print(isinstance(c, Car)) print(isinstance(c, str))

在这里插入图片描述

构造方法和析构方法

构造方法(初始化方法): 初始化对象的属性 当使用 类名() 创建对象时,会自动 执行以下操作:

为对象在内存中 分配空间 —— 创建对象为对象的属性 设置初始值 —— 初始化方法(init)这个初始化方法 就是 init 方法,init 是对象的内置方法 每1个类都有一个默认的__init__()方法。 如果定义类时显式地定义__init__()方法,那么创建对象时Python解释器会调用显式定义的__init__()方法。如果定义类时没有显式定义__init__()方法,那么Python解释器会调用默认的__init__()方法。init 方法是 专门 用来定义一个类 具有哪些属性的方法!并为这些属性设置初值。在 init 方法内部使用 self.属性名 = 属性的初始值 就可以 定义属性 定义属性之后,使用类创建的对象,都会拥有该属性。 析构函数 del

当一个对象使用完被释放或删除一个对象来释放类所占用资源的时候,Python解释器默认会调用 __del __( )方法。

class Number: def __init__(self, num): print("---开始初始化---") self.num = num n1 = Number("123456") print("n1的数字为: %s" % n1.num) n2 = Number("798012345") print("n2的数字为: %s" % n2.num) print() del n2 print("----还剩下?----") #n1是被默认删了

在这里插入图片描述

类成员与实例成员(数据成员)

类属性是类所拥有的属性,它需要在类中进行显示地定义(位于类内部,方法的外面),它被所有类的实例对象所共有,在内存中只存在一个副本。

属于实例的数据成员一般是指在构造函数**init()**中定义的,定义和使用时必须以 self 作为前缀。

Python中比较特殊的是,可以动态地为类和对象增加成员,也是Python动态类型特点的一种重要体现。

class Brick: price = "100元" # 定义类属性 def __init__(self, c): self.color = c # 定义实例属性 b1 = Brick("红色") # 实例化对象 b2 = Brick("蓝色") print("b1: ",b1.color, end = ' ') # 实例属性只能通过对象名访问 print(Brick.price, b1.price) # 类属性可以通过类名和对象名来访问 ############ Brick.price = 120 # 修改类属性 Brick.name = '岩石纹' # 动态增加类属性 b1.color = "绿色" # 修改实例属性,破坏了封装性 print("b2 ",b2.color, Brick.price, Brick.name) print("b1: ",b1.color, Brick.price, Brick.name)

在这里插入图片描述

私有成员与公有成员

公有成员: 类中定义的属性和方法默认为公有属性和方法,该类的对象可以任意访问类的公有成员。

为了契合封装原则,保证类中的代码不被外部代码轻易访问,Python支持将类中的成员设置为私有成员,在一定程度上限制对象对类成员的访问。

私有成员:在定义类的成员时,如果成员名以两个下划线“__”开头而不以两个下划线结束,则表示是私有成员。私有成员在类的外部不能直接访问。例如( __weigh =65 )

私有成员的访问 在公有方法中通过参数“self”访问,然后在类的外部可以通过调用对象的公开成员方法来访问 ;

class PInfo: __weight = "55kg" # 私有属性 def __info(self): # 私有方法 print(f"我的体重是:{self.__weight}") def get_weight(self): print(f"体重:{self.__weight}") #调用私有属性: __weight self.__info() #获取私有方法: __info p1= PInfo() p1.get_weight() # 方法一:通过公有方法访问私有成员 p1._PInfo__weight = "45kg" # 方法二:通过特殊方式在类外部修改私有成员 print("修改后:",p1._PInfo__weight) p1._PInfo__info()

在这里插入图片描述

类方法与静态方法

在类中定义的方法可以粗略分为四大类:公有方法、私有方法、静态方法和类方法。

公有方法、私有方法都属于对象静态方法和类方法都属于类

👉 私有方法的名字以两个下划线“__”开始,每个对象都有自己的公有方法和私有方法,在这两类方法中可以访问属于类和对象的成员;

👉 公有方法通过对象名直接调用,私有方法不能通过对象名直接调用,只能在属于对象的方法中通过self调用或在外部通过Python支持的特殊方式来调用。

👉 如果通过类名来调用属于对象的公有方法,需要显式为该方法的self参数传递一个对象名,用来明确指定访问哪个对象的数据成员。

👉 静态方法和类方法都可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员。

1)类方法 使用修饰器 @classmethod 来标识

class 类名:

@classmethod def 类方法名(cls): 方法体

一般将cls作为类方法的第一个参数名称,并且在调用类方法时不需要为该参数传递值。

要想调用类方法,既可以通过对象名调用类方法,又可以通过类名调用类方法,这两种方法没有任何区别。

在实例方法中无法修改类属性的值,但在类方法中可以修改类属性的值。

class Novel: name = "斗罗大陆" # 类属性:name __price = 33.33 # 私有类属性 def __init__(self,n): # 实例方法:name_1() self.name = "酒神" # 实例属性 self.__number = n # 私有实例属性 Novel.__price += 10 def show(self): # 普通实例方法 print("name:名字",self.name) print('self.__number:数量', self.__number) print('Root.__price:价格', Novel.__price) @classmethod # 类方法:neme_2() def name_2(cls): cls.name = "神澜奇域" print(cls.__price) print(cls.name) @staticmethod # 修饰器,声明静态方法 def name_static(): name = "天火大道" print(Novel.__price) print(name) # 1、普通实例方法的调用:show() n1 = Novel(21) ; n1.show() #效果相同 Novel.show(n1) # 通过类名调用实例方法时为self参数显式传递对象名 # 2、类方法的调用:name_2() n1.name_2() # n1.name_2() == Novel.name_2() 效果 Novel.name_2() # 3、静态方法的调用:name_static n2 = Novel(10) #调用不了私有实例属性 n n2.name_static() ; # 通过对象调用静态方法 Novel.name_static() # 通过类名调用静态方法 # n2.name_static() == Novel.name_static()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有