若不想输给任何人,就得先认清自己的弱小。——《妖精的尾巴》
引入面向对象
主流的软件开发思想
- 面向过程
- 面向对象
例子(买电脑)
-
面向过程:需要电脑、查询参数信息、横向比较机型、了解打折信息、与店家讨价还价、下单、收快递、开机验货、确认收货。面向过程就是整个过程自己一步一步写出来。
-
面向对象:需要电脑、找秘书帮我买、收电脑。面向对象编程能够让你按照需求去找相应的模块,从而实现相应的功能。这种编程思想能够减少代码量,让代码更整洁。
面向对象就是一种编程思想。
面向对象讲解
面向对象编程的2个非常重要的概念:类和对象。
-
类:抽象的,手机的设计图,用来描述特征信息以及功能等,不能实际使用。
-
对象:具体的,根据类的描述创造出来的,可以实际使用。
类就相当于一个模板,对象是根据模板做出来的实际的东西。
类是一类事物,对象是事物的实现。
类(模板):
类中有属性和方法两个组成部分。
-
属性(一般为赋值操作):描述信息,例如手机设计图中手机的长度或宽度。
-
方法(函数):功能模块,例如手机设计图中主板的功能。
类的构成:
类由3部分构成。
-
类的名称:类名
-
类的属性:一组数据
-
类的方法:功能模块的实现
案例:
1)人的设计
类的名称(类名):人(Person)
类的属性(一组数据):身高(height),年龄(age),性别(sex)
类的方法(功能模块的实现):跑(run)
举例(电子设备):
手机
类名: Sj
属性: 品牌,颜色,价格
行为: 打电话
电脑
类名: Dn
属性: 外观,品牌,价格
行为:打游戏,写代码
Switch
类名:Switch
属性:型号,价格
行为:打游戏
PS5:
类名:PS5
属性:型号,价格
行为:打游戏
用代码定义类:
固定格式:
class 类名:
初始化函数(属性的定义一般在这里实现)
方法列表
举例:
#class Person: #经典类(旧式类)定义
#class Person():
class Person(object): #新式类定义
def __init__(self):
self.height = 180
self.age = 20
self.sex = "男"
def run(self):
print("跑了2公里。")
说明:
1、为什么类名首字母要大写,类名规定要按”大驼峰命名法“,即首字母大写。
2、object是Python里所有类的最顶级类(涉及到后面类的继承)。
3、前两行注释的是经典类(旧式类)定义,后面的是新式类的定义。
4、__init__函数为初始化函数,类的属性一般定义在这里,如果没有定义属性,也可以不写这个函数,因为它默认会自己定义一个__init__函数,只不过里面没有属性。
5、每个函数后都有一个self参数,这表示这个函数是该类的方法。
6、属性名前面为什么要加上self.,因为这代表了这个属性是该类的属性。
创建对象:
构成:
对象名1 = 类名()
对象名2 = 类名()
对象名3 = 类名()
代码案例:
zhangsan = Person()
lisi = Person()
wangwu = Person()
完整代码:
class Person(object): #新式类定义
def __init__(self):
self.height = 180
self.age = 20
self.sex = "男"
def run(self):
print("跑了2公里。")
zhangsan = Person()
print(zhangsan.height) #对象调用类的属性
zhangsan.run() #对象调用类的方法
------------------------------------
#以下为运行结果
180
跑了2公里。
类的继承:
古代实行世袭制,有一位皇帝,将他的所有世袭给了他的儿子,这样他的儿子就有了这位皇帝的所有东西,以及他自己的所有东西,这位皇帝的儿子又将自己的所有世袭给了自己的儿子,即皇帝的孙子,那么这位皇帝的孙子就拥有了这位皇帝、他父亲以及他自己所有的东西。
| 拥有的东西
|
|皇帝(江山、兵法) #皇帝打下了江山并写下了兵法
|
|
|儿子(江山、兵法+子民、政治政策) #儿子拥有从父亲(皇帝)那继承的江山、兵法以及因为自己的政治治理所归附自己的子民和政治政策
|
|
|孙子(江山、兵法+子民、政治政策+金银、经济政策) #孙子拥有从父亲(儿子)那所继承的江山、兵法和子民、政治政策以及因为自己的经济政策所获得的金银和经济政策
|
|
v
代码举例:
class huangdi(object): #object代表huangdi是顶级父类
def __init__(self):
self.jiangshan = "江山"
def bingfa(self):
print("兵法就是枪炮!")
class erzi(huangdi): #erzi继承了huangdi这个类,huangdi是erzi的父类
def __init__(self):
super(erzi, self).__init__()
self.zimin = "子民"
def zhengzhizhengce(self):
print("政治政策就是好的法律!")
class sunzi(huangdi): #sunzi继承了erzi这个类,huangdi和erzi都是sunzi的父类
def __init__(self):
super(sunzi, self).__init__()
self.jinyin = "金银"
def zhengzhizhengce(self):
print("经济政策就是好的商业头脑!")
属性与方法代码调用举例:
#实例化对象
A = huangdi()
B = erzi()
C = sunzi()
#对于A
print(A.jiangshan)
A.bingfa()
__________________________________________
#运行结果
"江山"
"兵法就是枪炮!"
#对于B
print(B.jiangshan)
print(B.zimin)
B.bingfa()
B.zhengzhizhengce()
__________________________________________
#运行结果
"江山"
"子民"
"兵法就是枪炮!"
"政治政策就是好的法律!"
#对于C
print(C.jiangshan)
print(C.zimin)
print(C.jinyin)
C.bingfa()
C.zhengzhizhengce()
C.jingjizhengce()
__________________________________________
#运行结果
"江山"
"子民"
"金银"
"兵法就是枪炮!"
"政治政策就是好的法律!"
"经济政策就是好的商业头脑!"
注意:
1、对于类来说如果子类与父类的属性或这方法重名,那么子类的属性或方法将覆盖掉父类的属性或方法。
2、super(sunzi, self).__init__()是什么,这是用来调用父类的构造函数(即初始化函数__init__),这样子类就拥有了父类的属性(当然还有其他的东西,构造函数中可不止能定义属性,还可以执行其他的代码例如执行一句print)。
类的私有属性与私有方法:
-
类的私有属性与私有方法都不能通过对象直接访问,但可以在本类内部访问。
-
类的私有属性与私有方法都不能被子类继承,子类也无法访问。
-
私有属性与私有方通常用来处理类内部的事情,不能通过对象处理,起到安全作用。
私有属性与私有方法的案例:
在属性名和方法名前面加上两个下划线__,即为私有属性和私有方法。
-
私有属性:self.__height
-
私有方法:def __siyou(self):