知识点
-
面向对象编程思想
- 面向对象编程是一种编程范式,它使用“对象”来设计软件,这些对象可以包含数据和代码,即属性和方法。
- 面向对象的程序设计的核心是对象,世间存在的万物皆为对象(上帝式思维) 面向对象,就是在编程的时候尽可能的去模拟现实世界!所谓的模拟现实世界,就是使计算机的编程语言在解决相关业务逻辑的时候,与真实的业务逻辑的发生保持一致,需要使任何一个动作的发生都存在一个支配给该动作的一个实体(主体、对象),因为在现实世界中,任何一个功能的实现都可以看做是一个一个的实体在发挥其各自的“功能”(能力)并在内部进行协调有序的调用过程!
- 面向对象编程是一种编程范式,它使用“对象”来设计软件,这些对象可以包含数据和代码,即属性和方法。
-
面向过程 vs 面向对象
- 面向过程: 程序设计以过程为中心,将问题分解为一系列步骤,用函数实现。
- 优点: 降低编程复杂度,易于理解和实现。
- 缺点: 代码修改困难,可扩展性差。
- 面向对象: 以对象为中心,模拟现实世界中的事物和行为。
- 优点: 增强程序的扩展性和可维护性。
- 缺点: 控制性差,难以预测程序行为。无法像面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。
- 过程:
- 第一步:分析哪些动作是由哪些实体发出的。学生提出报名、学生提供相关资料、学生缴费、机构收费、教师分配教室、班级增加学生信息;一共有四个实体:学生、机构、教师、班级(实体即对象)。
- 第二步:定义这些实体,为其增加相应的属性和功能。
- 第三步:让实体去执行相应的功能|动作
- 面向过程: 程序设计以过程为中心,将问题分解为一系列步骤,用函数实现。
-
面向对象的三大特征
- 封装: 隐藏对象的内部状态和实现细节。
- 继承: 允许新创建的类(子类)继承现有类(父类)的属性和方法。
- 多态: 允许不同类的对象对同一消息做出响应,但具体行为会有所不同。
-
类与对象
- 对象: 现实世界中的事物,具有属性和方法。对象的特征用数据来表示,称为属性(property)。对象的行为用程序代码来实现,称为对象的方法(method)。
- 类: 一组具有相同属性和行为的对象的集合,为对象提供统一的抽象描述。它为属于该类的全部对象提供了统一的抽象描述。对象是类的实例(instance)。
-
类的定义,创建和对象的实例化
- 类(class)是具有相同属性和行为的一组对象的集合,由3部分组成的: 类名:类名,大驼峰,单词之间无分隔符 属性:一组数据,比如角色,性别等。 方法:允许进行操作的方法,比如走路。
- 使用关键字
class
定义类,使用__init__
方法进行对象的初始化。 - __init__方法:构造方法 无需直接调用,生成实例对象的时候自动调用,用来初始化新创建对象的属性。若没有定义构造方法(__init__()方法),在类的实例化时,系统会调用默认的无参构造方法。 self参数 代表当前类的实例。Python规定:实例方法的第一个参数,就必须是实例对象本身,并且约定俗成,把其名字写为self。self不是python的关键字,也可以用其他名称命名,但是为了规范和便于读者理解,推荐使用self。在调用时不必传入相应的参数。
- 通过类名和参数列表创建对象实例。
- 根据类创建对象的语法格式:对象名 = 类名(参数列表)
- 给对象添加属性:对象名.新的属性名 = 值
- 访问对象的属性:对象名.属性名
- 访问对象的方法:对象名.方法名([实参])
- 注意:调用方法时,实参要与除self以外的其他形参匹配
- 类和函数: 相似:以“冒号:”开始,统一缩进 区别:关键字(def - class)
-
属性和方法
- 属性: 对象的状态,存储为数据。
- 方法: 对象的行为,实现为函数。
- 类属性:在类中且在方法之外定义。类属性就是类对象所拥有的属性,用来记录与这个类相关的特征,它被所有类对象的实例对象所公有,在内存中只存在一个副本。类属性可以通过类名以及实例名来访问。
- 类名.__name__# 类的名字(字符串)
- 类名.__doc__# 类的文档字符串
- 类名.__base__# 类的第一个父类(在讲继承时会讲)
- 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
- 类名.__dict__# 类的字典属性
- 类名.__module__# 类定义所在的模块
- 类名.__class__# 实例对应的类(仅新式类中)
-
类 不用new,用__init_ 对象 类变量(方法外定义) 实例变量(__init__方法内定义) 实例方法(默认) 第一个参数self,自动绑定到 实例方法 类方法 第一个参数cls 静态方法
-
属性和方法的访问控制
- 类属性: 属于类本身,所有实例共享。
- 实例属性: 属于对象实例,每个实例独立拥有。实例属性是不需要在类中显式定义,而在__init__构造函数中定义的。在其他方法中也可以随意添加新的实例属性,但并不提倡这么做,所有的实例属性最好在__init__中给出。实例属性属于实例(对象),只能通过对象名访问。
- 说明:在init()方法中初始化对象的全部属性是一个好习惯,可以帮助用户更好地管理类中的属性和对属性值的更改。
- 说明: python 创建和类属性同名的实例属性,通过实例访问就是实例属性,通过类访问的属性就是类的属性
- 实例方法:通常情况下,在类中定义的方法默认都是实例方法。只有实例化对象之后才可以使用的方法。
- 实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)。
- 实例方法通常会用实例对象直接调用。当然,Python 也支持使用类名调用实例方法,但此方式需要手动给 self 参数传值
- 两个特殊的实例方法: 构造方法:__init__(self) 析构方法__del__(self)。此方法一般无需定义。当对象在内存中被释放时,自动触发执行.
- 类方法: 类方法是类对象所拥有的方法。使用
@classmethod
装饰器,与类相关的方法。可以通过类对象和类的实例对象访问。-
- 使用方法: 对象名.类方法名。或者是 类名.类方法名 作用:用来修改类属性,或调用其他的类方法。 应用场景:当一个方法中只涉及到静态属性的时候可以使用类方法.
- 静态方法: 使用
@staticmethod
装饰器,与类和实例都无关的方法。静态方法不需要多定义参数。可以通过类对象和实例对象访问。-
- 使用方式: 类名.类方法名(或者实例对象名.类方法名)。 功能:将被装饰的函数从类中分离出来,该函数不能访问类的属性,简单说可以将该函数理解为一个独立的函数,不允许使用self。 应用场景:一般用于和类对象以及实例对象无关的代码。
- static method(静态方法):既不使用对象的属性,也不使用类的属性 class method(类方法):不使用对象的属性,只使用类的属性
- python私有方法和私有属性:
- Python默认的成员函数和成员变量都是公开的。 在变量名或函数名前加上 "__"两个下划线,那么这个函数或变量就会为私有的了。 声明该方法为私有方法,不能在类的外部调用。但可以在类内部访问私有方法。
- 为了更好的保存属性安全,即不能随意修改,一般的处理方式为: 将属性定义为私有属性(以两个下划线开头) 添加一个可以调用的方法,供调用 说明: python 私有属性只能在类内部访问,类外面访问会出错。 python 保护属性更多的是一种语法上的标识,用来提醒直接修改改对象时候要小心。
实验
- 实验目的:
- 掌握python的面向对象的程序设计概念
- 理解python的类与对象的定义
- 掌握python的类与对象的操作方法
- 理解python的属性、方法和函数的区别
- 实验内容:
说明:基础题为必做题,提高题为选做题
- (基础题)
定义矩形类Rectangle,有三个方法:
(1)__init__方法:初始化长和宽
(2)getArea方法:返回矩形的面积
(3)getPerimeter方法:返回矩形的周长
输出长为10,宽为5的矩形的周长和面积
代码:
class Rectangle:def __init__(self, length, width):self.length = lengthself.width = widthdef getArea(self):return self.length * self.widthdef getPerimeter(self):return 2 * (self.length + self.width)# 创建对象并调用方法
rectangle = Rectangle(10, 5)
print("周长:", rectangle.getPerimeter())
print("面积:", rectangle.getArea())
2、(基础题)
定义一个学生类Student
1.有下面的属性:姓名 年龄 成绩(语文,数学,英语)[每课成绩的类型为整数]
2.包含如下方法
1) 获取学生的姓名:get_name() 返回类型:str
2 )获取学生的年龄:get_age() 返回类型:int
3 )返回3门科目中最高的分数:get_course() 返回类型:int
调用相应方法,分别输出某学生姓名,年龄和最高成绩。
代码:
class Student:def __init__(self, name, age, scores):self.name = nameself.age = ageself.scores = scoresdef get_name(self):return self.namedef get_age(self):return self.agedef get_course(self):return max(self.scores)# 创建对象并调用方法
student = Student("张三", 20, [88, 92, 85])
print("姓名:", student.get_name())
print("年龄:", student.get_age())
print("最高成绩:", student.get_course())
3.(基础题)商品打折扣(所有商品8折出售)
提问:分析此方案的弊端,并提出改进方案(用类属性和类方法结合实现所有商品统一打折)
- 此方案的弊端
- 改进代码:(用类属性和类方法结合实现所有商品统一打折)
代码:
class Product:discount = 0.8 # 类属性,统一折扣def __init__(self, price):self.price = price@classmethoddef apply_discount(cls, price):return price * cls.discount# 使用
original_price = 100
discounted_price = Product.apply_discount(original_price)
print("打折后价格:", discounted_price)
4.(选做题)
编写有一个学生类,提供name、age、gender、phone、address、email属性,为该类提供带所有成员的构造器,并提供方法,用于描述吃、喝、玩、睡等行为。
代码:
class Student:def __init__(self, name, age, gender, phone, address, email):self.name = nameself.age = ageself.gender = genderself.phone = phoneself.address = addressself.email = emaildef eat(self):print(f"{self.name} is eating.")def drink(self):print(f"{self.name} is drinking.")def play(self):print(f"{self.name} is playing.")def sleep(self):print(f"{self.name} is sleeping.")# 创建学生对象
student1 = Student("Alice", 20, "Female", "123-456-7890", "123 Apple St.", "alice@example.com")# 调用行为方法
student1.eat()
student1.drink()
student1.play()
student1.sleep()
Python中的类由什么组成?对象的状态、行为用什么来表示?
Python中的类主要由以下几部分组成:
- 属性: 用来表示对象的状态,可以是数据字段,也可以是方法。
- 方法: 定义了对象的行为,即对象可以执行的操作。
对象的状态和行为表示
- 状态: 通常由对象的属性来表示,这些属性存储了数据,描述了对象的特征。
- 行为: 通过对象的方法来表示,这些方法是可以被调用的函数,定义了对象能执行的操作。
如何定义Python中的类?类属性与对象属性有什么不同?
定义Python中的类
在Python中,使用
class
关键字来定义一个类。类定义通常包括初始化方法__init__
和其他方法。例如:class MyClass:def __init__(self, attribute1, attribute2):self.attribute1 = attribute1 # 实例属性self.attribute2 = attribute2def method1(self):# 方法体pass
类属性与对象属性的区别
- 类属性: 属于类本身,由类的所有实例共享。它们在类定义的外部定义,但在方法内部可以通过
cls
参数访问。- 对象属性: 属于类的每个实例,每个实例都有自己的独立副本。它们通常在
__init__
方法中定义。怎样创建类的对象?怎样调用对象方法?
创建类的对象
创建类的对象,即实例化类,是通过使用类名后跟括号和必要的参数来完成的。例如:
my_object = MyClass(value1, value2)
调用对象方法
要调用对象的方法,需要使用点符号(
.
)连接对象的名称和方法的名称,并传递必要的参数。例如:my_object.method1()
这里是一个具体的例子,展示如何定义类、创建对象以及调用方法:
# 定义一个类 class Person:species = 'Homo sapiens' # 类属性def __init__(self, name, age):self.name = name # 对象属性self.age = agedef speak(self, message):print(f"{self.name} says: {message}")# 创建对象 person1 = Person("Alice", 30)# 调用对象方法 person1.speak("Hello, world!")# 访问类属性 print(Person.species)
在这个例子中,
Person
类有两个属性:species
是一个类属性,name
和age
是对象属性。speak
是一个实例方法,它通过person1
对象被调用。