面向过程编程思想:
核心是 过程 二字,过程指的是解决问题的步骤,即先干嘛再干嘛
基于编程思想编写程序,相当于一条流水线,一种机械式的思维方式
面向对象的编程思想
核心是 对象 二字 是个容器
对象是指的是数据与方法的集合体,也就是一个容器
基于该编程的思想编写程序,就好比是创造世界,一种上帝式的思维方式。
一、类与对象
对象:特征与技能的集合体,即数据与方法
类:一系列的相似特征与技能的集合体
二、面向对象的三大特征
封装:把一堆数据属性与方法属性整合到对象内,
隐藏:
__+属性:-----》把属性变形了,即影藏起来
封:封起来
装:装起来
继承:
父类是一系列类的共有属性与方法的结合体
子类是可以继承父类的属性和方法的结合体
组合:1、继承父类的属性,且不与父类耦合在一起
2、把一个对象放到另外一个对象内部
组合是继承的一种应用
多态:
1.抽象类
2.鸭子类型
1 # class People: 2 # def __init__(self, name, age, sex): 3 # self.name = name 4 # 5 # 6 # class Student(People): 7 # pass 8 9 # 10 # 11 # class Course: 12 # def __init__(self, name): 13 # self.name = name 14 # 15 # 16 # class Student: 17 # def __init__(self, name, age, sex): 18 # self.name = name 19 # self.age = age 20 # self.sex = sex 21 # self.course = [] 22 # 23 # course = Course('python') 24 # # print(course.name) 25 # 26 # student = Student('张全蛋', 18, 'male') 27 # student.course.append(course)
三、绑定方法
对象的绑定方法:有对象来调用,会自动把对象本身当成参数传递给self,谁调用就传谁
1 ''' 2 @classmethod 3 ''' 4 5 class People: 6 country = 'china' 7 8 def __init__(self, name): 9 self.name = name 10 11 def run(self): 12 print('%s running...' % self.name) 13 14 @classmethod 15 def eat(cls): 16 print(cls) 17 18 # p1 = People('l_egon') 19 # 20 # p1.eat() 21 # People.eat() 22 23 24 # p2 = People('jason') 25 # 26 # print(p1.run) # 0x0000026EFFE77F60 27 # print(p2.run) # 0x000001EAAB3AC710 28 29 30 31 ''' 32 # staticmethod: 非绑定方法 33 ''' 34 35 # class People: 36 # country = 'china' 37 # 38 # def __init__(self, name): 39 # self.name = name 40 # 41 # def run(self): 42 # print('%s running...' % self.name) 43 # 44 # @staticmethod 45 # def eat(): 46 # print('eat....') 47 # 48 # p = People('tank') 49 # p.eat() 50 # People.eat() 51 52 53 ''' 54 # property: 55 ''' 56 # class People: 57 # country = 'china' 58 # 59 # def __init__(self, name, height, weight): 60 # self.name = name 61 # self.height = height 62 # self.weight = weight 63 # 64 # def run(self): 65 # print('%s running...' % self.name) 66 # 67 # @property 68 # def bmi(self): 69 # return self.weight / (self.height ** 2) 70 # 71 # 72 # p = People('tank', 1.8, 65) 73 # # print(p.bmi()()) 74 # 75 # print(p.bmi) # p.bmi()# student.course.append(course)
四、classmethod,staticmethod ,property
classmethod :本质上是装饰器,装饰给类里面的方法
被装饰的方法,类的绑定方法
staticmethod: 非绑定方法,装饰成普通的函数
@property:在类内部,把一个函数装饰成一个数据属性
六 面向对象:高级
1、反射:通过字符串操作类与对象的属性
hasattr:判断对象或者类的属性是否存在
getattr:获取对象或者类的属性
参数1:对象
参数2:'属性名'
参数3:默认值
setattr:设置对象或者类的属性
delattr:删除对象或者类的属性
2、类的内置方法:
__init__():调用类的时候自动触__init__
__str__():打印对象的时候触发此方法,此方法内必须return一个字符串
__del__():在对象的占用空间被释放,会自动触发__del__()方法的运行
__steattr__:修改属性会自动触发
__delattr__:删除属性会自动触发
__call__:调用对象的时候触发
1 class People(object): 2 school = 'oldboy' 3 4 # def __del__(self): 5 # print('对象已被清除!') 6 # 7 def __init__(self, name): 8 self.name = name 9 # 10 # def __str__(self): 11 # return '%s from %s' % (self.name, self.school) 12 13 def __setattr__(self, key, value): 14 self.__dict__[key] = value 15 # print(key, value) 16 17 # def __call__(self): 18 # print('调用对象的时候会自动此方法') 19 # print(self.school) 20 21 p = People('tank') 22 # print(p) 23 # p.age = 18 24 # p.name = 'jason' 25 # 26 # # print(p.__dict__) 27 # print(People.__dict__) 28 29 p()