文章目录
一、面向对象的概念
面向对象是指将数据和操作数据的方法全部封装到对象中使得组织代码和数据的方法接近人的思维
面向过程:关注的是程序逻辑流程,是执行者思维,适合写小规模程序,找动词
面向对象:关注的是对象之间的关系,是设计者思维,适合大规模程序,找名词
两者相铺相成,面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。 但是具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理,现面向对象再面向过程可极大简化程序
对象的衍变:
简单数据-——>数组(放同类数据)——>结构体(放不同类型的同一的元素不同特性,例如:学生各项信息姓名,年龄,成绩等)——>对象(不同类型数据,方法,例如学生各项信息:成绩,绩点,绩点由对象内方法(函数)计算得出)
注解:结构体(参考C语言),对象(参考java对象)
二、面向对象技术简介
- 类:用来描述具有相同属性和方法的对象的集合,定义了集合内每个对象所共有的属性和方法
- 对象:通过类对象定义的数据结构实例,对象包含两个数据成员(类变量和实例变量)和方法
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例属性(变量):在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。如self.name
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
类是制造对象(饼干)的模具,从一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属性值(不共享状态)。更具体一点:“方法代码是共享的,属性数据不共享”。
类的结构:方法(函数),属性(行为)
对象的结构:方法(由同一个类创建的所有对象共享),属性(每个对象维持自己的属性)
1.定义一个类
class Students :#驼峰命名法类名
#可以什么都不写用pass占空
def __init__(self,name,score):#self必须在第一个参数,__init__特殊方法用来构造方法
self.name=name#传参到实例属性,name为实例属性名
#self.name='name'#传参到实例属性,name为实例属性名,这样那么为固定值
self.score=score#这样score为固定值
#——————————————————构造方法——————————————
def say_score(self):#self必须为第一个参数
print(f"{self.name}的分数为{self.score}")
#——————————————————普通方法——————————————
s1=Students("高",17)
s1.say_score()
输出结果为
>>>
========================= RESTART: D:/Pwork/class.py =========================
高的分数为17
>>>
2.构造函数__init__()和__new()方法
一个Python对象包括:
- id(identify 识别码)
- type(对象类型)
- value(对象的值)
- 属性(attribute )
- 方法(method)
构造方法用于执行“实例对象的初始化工作”,即对象创建后,初始化当前对象的相关属性,无返回值
__init__()要点:
- 名称固定
- 第一个参数必须为self。self指的是刚刚建好的实例对象
- 构造函数通常用来初始化实例对象的实例属性
- “类名(参数列表)”用来调用构造函数。调用后将创建好的对象返回给相应变量
- 初始化创建好的对象,初始化指的是:给实例属性赋值
- __new__()方法用来创建对象,但我们一般不需要重定义该方法
- 如果我们不定义该方法系统会提供一个默认的__init__方法,
self 必须为构造函数的第一个参数,名字可以任意修改。但一般遵守惯例,都叫做 self。
3.实例属性
实例属性是从属于实例对象的属性,也称为“实例变量”。他的使用有如下几个要点:
1. 实例属性一般在__init__()方法中通过如下代码定义:
self.实例属性名 = 初始值
2. 在本类的其他实例方法中,也是通过 self 进行访问:
self.实例属性名
3. 创建实例对象后,通过实例对象访问:
obj01 = 类名(参数,参数) | #创建对象,调用__init__()初始化属性 |
obj01.实例属性名 = 值 | #可以给已有属性赋值,也可以新加属性 |
4.实例方法
实例方法是从属于实例对象的方法,实例方法的定义格式如下:
就是个普通方法函数格式没啥写的
调用:对象名.方法名(参数表)
要点:
1. 定义实例方法时,第一个参数必须为 self。和前面一样,self 指当前的实例对象。
2. 调用实例方法时,不需要也不能给 self 传参。self 由解释器自动传参。
函数和方法的区别:
1. 都是用来完成一个功能的语句块,本质一样。
2. 方法调用时,通过对象来调用。方法从属于特定实例对象,普通函数没有这个特点。
3. 直观上看,方法定义时需要传递 self,函数不需要。
5.其他操作
- dir(obj)获取对象所有属性,方法
- obj.__dict__ 对象的属性字典
- pass 空语句
- isinstance(对象,类型) 判断对象是不是指定类的对象
>>> print(dir(si))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_score', 'score']
>>> si.__dict__
{'name': 'hh', 'score': 34}
>>> isinstance(si,Students)
True
>>>