一.什么是面向对象
面向对象是一种编程范式,它是将程序中的数据和操作封装在一个对象中,从而使得程序更加模块化,可重用和维护。面向对象编程中,对象是类的实例化,类是一种抽象的数据类型,它定义了一组属性和方法。(类,对象,属性,方法是什么下面我会具体解释)
二.面向对象的三大特征
封装,继承,多态是面向对象的三大基本特征
这三类也是我们学习面向对象的主要部分
1.封装
在面向对象编程中,为了保护对象的状态不受外界影响,将对象的状态和行为打包在一个构件中,这种特性就是封装性。其实可以理解为将数据和方法封装在一个单独的单元中,来确保其安全性。(根据职责将属性和方法封装到一个抽象的类中)
class Stu:
stu_id = '0001'
def __init__(self, name):
self.name = name
上方代码,我建立了一个学生类(Stu),类中我建立了一个初始化方法和一个类属性 stu_id,那么这两个就可以理解为被封装起来了,它们不受外界影响。
2.继承
继承是指在创建一个新的类时可以从其它已有的类中获得一些属性和行为,同时新类也可以有自己特有的属性和行为。(可以理解为在生物学上,父与子的联系,子继承了父亲的基因,拥有了父亲的一些特点,但子还可以在原有基因外拥有一些别的特点)
class Father:
def __init__(self):
self.height = 'A'
self.weight = 'A'
def like(self):
print("I like Python")
father = Father()
print(father.weight, father.height, sep=' ') # A A
father.like() # I like Python
class Son(Father):
def __init__(self):
super().__init__()
self.appearance = 'A'
son = Son()
son.like()#I like Python
print(son.height,son.weight,son.appearance,sep=' ')# A A A
上述代码"Father"是父类,“Son”是子类,父类拥有A的身高,A的体重,并且喜欢Python。子类继承了父类的属性与方法也拥有了A的身高,A的体重以及也喜欢Python,但子类相对于父类而言其颜值也是A,这就是上面说所的“ 可以从其它已有的类中获得一些属性和行为,同时新类也可以有自己特有的属性和行为”。
3.多态
一类事物有多种形态,一个抽象类有多个子类,不同子类对象调用相同的方法,产生不同的结果。
可以理解为:我们现在有一个A类,又有B,C,D类,但B,C,D是A的子类。那么现在A中有一个x方法,所以B,C,D都可以调用x方法但产生不一样的结果,还可以再定义一个函数(fun(obj)),当obj = B 或 C 或 D 这个函数就会执行不同的功能,这就是多态的体现。
class A: # 父类
tt = 1
def way1(self):
print('A')
class B(A): #子类
def way1(self):
print('B')
class C(A): #子类
def way1(self):
print('C')
def fun(obj):
num1 = obj()
num1.way1()
fun(A)# 输出A
fun(C)# 输出C
fun(B)# 输出B
上方代码,A为父类拥有方法way1,同时子类 B , C , D 也拥有方法way1,而且调用不同的类way1方法时输出的结果把不同,这就是多态的体现!。这里我创建了函数fun(obj) 将way1放到其中,更容易体现多态的性质。
二.类与对象
1.类与对象的概念
类是具有相同属性与行为的对象的集合。它是对一群具有相同特征或行为的事物的一个统称,是抽象的,不能直接使用。就像一个模板,是负责创建对象的。
对象是由类创建出来的一个具体存在,可以直接使用。
举个例子:全国所有的高校都有些相同的属性,例如:开设课程,建筑的种类,所以我们可以建一个学校类,这个类里包含了所有学校的相同特征例如开设的课程。中国科学技术大学在这个类里就说其一个对象,简而言之学校类就是模板,中科大就是其创造的对象。
class School: # 类
build = "操场,教学楼,食堂" # 类属性
ustc = School() # csu 就是 school类的实例化对象
print(csu.build) # 操场,教学楼,食堂
2.类的定义与对象实例化
class 类名:
属性1名 = 属性值
属性2名 = 属性值
def 方法1(self):
pass
def 方法2(self):
pass
对象变量 = 类名()
对象名.方法1()
对象名.属性1
根据上方的格式基本表示了类和对象的创建格式我们具体分析一下:
类名 :这个就像是上面解释的学校(School) ,当然它也可以是 A , B 等等都可以,一般依据类的含义去创建,类名的首字母一般大写。
属性与方法:请看下面3,4的具体说明
对象变量:这里可以理解为上面举例的中科大(ustc),它是类的实例化对象。它可以对类内的方法和属性进行调用
下面是对上方类的定义与对象实例化格式的具体书写,类我仍以School 对象仍为ustc
class School:
people = '10000~40000' # 属性
mainbuild = "教学楼,操场,食堂,宿舍楼" # 属性
def stulike(self): # 方法
print("学生爱学习")
ustc = School() # 对象
ustc.stulike() # 对象名.方法名() # 输出学生爱学习
print(ustc.people) # 对象名.属性名 # 输出 10000~40000
3.属性
通过上面的大致介绍,我们大致知道了属性,这里我再具体解释一下
属性分为两类:1.类属性,2.实例属性
1.类属性
类属性是所有实例对象共享的属性,所有的实例对象都可以引用同一个类的属性,例如正上面代码中的people 与 mainbuild。类属性可以直接通过类名称进行访问,同时也可以通过实例对象进行访问。类属性的定义一般在类体里,方法体外。
class School:
people = '10000~40000' # 类属性
mainbuild = "教学楼,操场,食堂,宿舍楼" # 类属性
def stulike(self): # 方法
print("学生爱学习")
ustc = School() # 对象
No1 = School() # 对象2
print(ustc.people) # 输出10000~40000
print(No1.people) # 输出10000~40000
2.实例属性
实例属性是每一个实例对象各自独立的属性。实例属性只能通过具体对象的引用访问。实例对象一般通过对象的引用定义,在类体中通过“self.实例属性”的形式访问与定义。
class A:
def __init__(self, num):
self.num = num
def way1(self):
print('A')
a = A(1)
print(a.num) # 输出1
这里运用了初始化方法,我会在后面的文章具体讲解,这里只需要理解self与实例属性num 就可以了
对于self 我们可以这样理解: 谁要去调用这个属性,是self!此时self代表着实例对象' a '。同理在创建其他对象时也是一个含义。
4.方法
面向对象编程中我们称动态行为为方法。也可以理解为 在类的作用域里面定义的函数,就叫做方法
面向对象有多种方法,这里只说实例方法,其他的在下一篇讲解。
我们把带有self固定参数的方法叫做实例方法,这个方法是属于实例的,一般通过self参数来传递实例的属性和方法。
当调用实例方法时,如果是实例对象引用时则不需要显式self参数,如果是是类名直接调用则需要引用对象名
class A:
def __init__(self, num): # 这个也是实例方法
self.num = num
def way1(self): #实例方法
print('A')
a = A(1)
a.way1() # A
A.way1(a) # A
本章只是初步了解面向对象编程,如果想要了解的更加深刻请看后面的章节继续学习。