一、面向对象设计(Object Oriented Design)
将一类具体事物的数据和动作整合到一起,即面向对象设计
理解两个概念:
类:把一类事物的相同的特征和动作整合到一起就是类,类就是一个抽象的概念
对象:就是基于类而创建的一个具体的事物(具体存在的),也就是特征和动作整合到一起
例:
def people(gender,country): #定义一个“人”的类 def init(gender, country): #相当于初始化 dir = { #人的特征和动作 "gender":gender, "country": country, "eat": eat, "sleep":sleep } return dir def eat(dir): print("%s %s正在吃饭"%(dir["country"], dir["gender"])) def sleep(dir): print("%s %s正在睡觉"%(dir["country"], dir["gender"])) return init(gender, country) p1 = people("man", "China") #得到的是一个字典 p1["eat"](p1) #通过字典取值调用函数,函数需要的参数在字典里 p2 = people("女人", "日本") p2["sleep"](p2)
二、面向对象编程(Object oriented Programming)
用定义类 + 实例/对象的方法去实现面向对象的设计
实例化:由类生产对象的过程叫实例化,类实例化的结果就是一个对象,或者叫做一个实例(实例 = 对象)
..... class 类名 : '类的文档字符串' 类体 .....
class Chinese: '这是一个中国人的类' pass #实例化 p1 = Chinese() #就相当于函数的return返回的结果 print(p1)
#经典类 class 类名 : '类的文档字符串' pass #新式类 class 类名(object) : pass
在python2中,经典类和新式类不同,在python3中都归为新类
三、属性相关知识
1. 数据属性:就是变量
2. 函数属性:就是函数,在面向对象里通常称为方法
注意:类和对象均用点来访问自己的属性
class Chinese: '这是一个中国人的类' dang = 'gong chan党' print(Chinese.dang)
class Chinese: '这是一个中国人的类' dang = 'gong chan党' def helpp(): print("一个人正在帮助老奶奶") def jump_queue(self): print("插到了前面") print(Chinese.dang) Chinese.helpp() Chinese.jump_queue("暂时随便传个参数")
class Chinese: '这是一个中国人的类' dang = 'gong chan党' def helpp(): print("一个人正在帮助老奶奶") def jump_queue(self): print("插到了前面") print(dir(Chinese)) #以列表形式存放属性名 print(Chinese.__dict__) #查看字典属性 #类的点方法就是到属性字典里面取值 print(Chinese.__dict__["dang"]) Chinese.__dict__["helpp"]() Chinese.__dict__["jump_queue"]("暂时随便传个参数")
四、特殊的类属性
class Chinese: '这是一个中国人的类' dang = 'gong chan 党' def helpp(): print("一个人正在帮助老奶奶") def jump_queue(self): print("插到了前面") print(Chinese.__name__) #类名字符串 print(Chinese.__doc__)# 类文档字符串 print(Chinese.__base__) #类的老祖先(讲继承时讲) print(Chinese.__bases__)#类的祖先元组形式 print(Chinese.__module__) #类所在的模块 print(Chinese.__class__) #实例该类对应的类
五、对象相关知识
class Chinese: '这是一个中国人的类' dang = 'gong chan 党' def __init__(self, name, age, gender): #初始化,实例化类的时候自动调用 self.mingzi = name self.nianling = age self.xingbiie = gender def helpp(): print("一个人正在帮助老奶奶") def jump_queue(self): print("插到了前面") #实例化,就是调用__init__的过程,实例化的结果不包括函数属性,只有数据属性。 p1 = Chinese('金灵', 19, 'girl') print(p1.__dict__) #得到init中初始化的字典数据 print(p1.__dict__["nianling"]) print(p1.nianling) #下面这个是通过点方法直接查看年龄,其内部就是上面那个过程
class Chinese: '这是一个中国人的类' dang = 'gong chan 党' def __init__(self, name, age, gender): #初始化,实例化类的时候自动调用 self.mingzi = name self.nianling = age self.xingbiie = gender def helpp(): print("一个人正在帮助老奶奶") def jump_queue(self): print("{}插到了前面".format(self.mingzi)) #实例化,就是调用__init__的过程,实例化的结果不包括函数属性,只有数据属性。 p1 = Chinese('乔碧萝', 58, 'wuman') Chinese.jump_queue(p1) #太low,用下面的对象方法调用 p1.jump_queue() p1.helpp() #会报错,因为在python底层,会把这行代码写成 p1.helpp(p1),而函数本身不需要参数
self的意义:
self 就是实例本身,这里指 p1
class Chinese: '这是一个中国人的类' dang = 'gong chan 党' def __init__(self, name, age, gender): #初始化,实例化类的时候自动调用 self.mingzi = name self.nianling = age self.xingbiie = gender def helpp(): print("一个人正在帮助老奶奶") def jump_queue(self): print("{}插到了前面".format(self.mingzi)) #实例化,就是调用__init__的过程,实例化的结果不包括函数属性,只有数据属性。 p1 = Chinese('乔碧萝', 58, 'wuman') #调用jump_queue函数时,先在p1所在的init下(即p1.__dict__)下去找,找不到去外面一层找,即类字典下(Chinese.__dict__) #即函数属性跟类要 p1.jump_queue()