之前学的都都是面向过程编程,我理解的面向过程就是写好流程图,跟着流程图一步一步走,实现功能。python
面向对象是你是一个上帝,滴尿成湖,泼尿成海,创造万物,赋予他们属性,调用他们的功能,实现咱们的目的。数据库
面向对象的几个核心特性以下编程
Class 类
一个类便是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具有的属性(variables(data))、共同的方法app
class a: #经典类ide
class a(object)#新式类函数
Object 对象
一个对象便是一个类的实例化后实例,一个类必须通过实例化后方可在程序中调用,一个类能够实例化多个对象,每一个对象亦能够有不一样的属性,就像人类是指全部人,每一个人是指具体的对象,人与人以前有共性,亦有不一样spa
就是实力话一个对象。。。。。code
Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法对象
经常使用方法:blog
析构函数
在实例释放、销毁的时候执行,一般进行收尾工做,若是关闭一些数据库链接,打开的临时文件
语法:
def __del__(self): print('%s 完全死了'%self.name)
私有方法
内部执行的方法,避免外部调用,例如cs见血经过被人攻击
语法:
def __init__(self,name,role,weapon,life_value=100,money=800): #构造函数 self.name=name #实例变量,静态属性 self.role=role self.weapon =weapon self.__life_value=life_value #这里设置的私有属性,只能经过特定的方法调用 self.money=money
Inheritance 继承
一个类能够派生出子类,在这个父类里定义的属性、方法自动被子类继承
python2 经典类是按照深度优先来继承,新式类是按照广度来继承的。
python3经典类跟新式类都是统一按照广度优先来继承的
Polymorphism 多态
一种接口多种实现。
类的实例,里边含有类的基本语法,默认参数,私有属性(方法)
在运行那块有函数的运行机制,
1 class role: 2 n=123 #默认参数 3 n_list=[] 4 def __init__(self,name,role,weapon,life_value=100,money=800): 5 #构造函数 6 self.name=name #实例变量,静态属性 7 self.role=role 8 self.weapon =weapon 9 self.__life_value=life_value #这里设置的私有属性,只能经过特定的方法调用 10 self.money=money 11 12 13 def buy_gun(self): #类的方法,功能,动态属性 14 print('%s buy gun %s'%(self.name,self.weapon)) 15 16 def __shot(self): 17 print('%s shooting'%self.name) 18 19 def got_shot(self): #运行一次,value就减小20 20 self.__life_value -= 20 #私有属性-20 21 print('%s : I got shot... '%self.name) 22 23 def show_status(self): 24 print('name:%s weapon:%s life_value:%s'%(self.name,self.weapon,self.__life_value)) 25 r1=role('qiangql','ploice','m4') 26 r2=role('w33','T','b12') 27 28 print(r1.n,r1.name) 29 print(role.n) 30 r1.n ='333' 31 print(r1.n) #r1里n=333,可是r2里的n仍是123 32 print(r2.n) 33 r1.n_list.append('444') 34 print('r1.n_list添加了444',r1.n_list,r2.n_list) 35 r2.n_list.append('5555') 36 print('r2.n_list 添加了5555',r1.n_list,r2.n_list,role.n_list) 37 r1.n_list.append('www') #先用r1.list添加www, 38 r1.n_list=['313','33156'] #给r1.list 赋值 39 role.n_list.append('yy') 40 print('打印赋值后的r1.list,以及用r1添加www,用role.n_list 添加yy',r1.n_list,r2.n_list,role.n_list) 41 #没有赋值就用就用默认参数,若是单独赋值,就等于建立了一个单独的参数保存 42 r1.buy_gun() #买枪 43 r1.show_status() #打印状态 44 r1.got_shot() #收到伤害 45 r1.got_shot() #收到伤害 46 r1.show_status() #打印状态
1 C:\Users\qiangql\AppData\Local\Programs\Python\Python36-32\python.exe C:/Users/qiangql/PycharmProjects/untitled1/lei.py 2 123 qiangql 3 123 4 这里让r1=333 333 5 123 6 r1.n_list添加了444 ['444'] ['444'] 7 r2.n_list 添加了5555 ['444', '5555'] ['444', '5555'] ['444', '5555'] 8 打印赋值后的r1.list,以及用r1添加www,用role.n_list 添加yy ['313', '33156'] ['444', '5555', 'www', 'yy'] ['444', '5555', 'www', 'yy'] 9 qiangql buy gun m4 10 name:qiangql weapon:m4 life_value:100 11 qiangql : I got shot... 12 qiangql : I got shot... 13 name:qiangql weapon:m4 life_value:60 14 15 Process finished with exit code 0
继承实例
里边有重构父类的方法,继承父类的方法。还有经过第三个类,将两个子类联系在一块儿。
class People: def __init__(self,name,age): self.name=name self.age=age self.friends=[] def sleep(self): #父类里边有睡觉吃饭的共有属性 print('%s sleeping'%self.name) def eat(self): print('%s chi TMD'%self.name) class Relation(object): #交朋友 def make_friends(self,obj): #这里obj指的是一个实例 print('%s is making friends with %s'%(self.name,obj.name)) self.friends.append(obj) #将obj全部的信息添加到表里 class Man(People,Relation): #这里继承两个类,把两个子类连接起来,relation里边没有名字参数,可是people有 def __init__(self,name,age,money): #People.__init__(self,name,age) #这里经典类的继承方法,统一用新式类的 super(Man,self).__init__(name,age) #这里是新式类的继承方法 self.money=money #由于多了一个属性,重构了一下。若是没有多余的属性,就不须要额外重构 def piao(self): #特定的属性 print('%s go heiheihei'%self.name) def sleep(self): People.sleep(self) #重构了方法,先执行父类的 print('%s with woman sleeping'%self.name) class Woman(People,Relation): def huazhuang(self): #特定的属性 print('%s go change haed '%self.name) def sleep(self): print('%s with man sleeping'%self.name) m1=Man('qiangql',17,20) m1.piao() m1.eat() #继承父类的吃 m1.sleep() #这里sleep有一个是执行了父类,一个是重构的 w1=Woman('dadagouquan',23) w1.huazhuang() w1.sleep() m1.make_friends(w1) #原本两个子类没有联系,经过一个共有的方法,联系在了一块儿 print(m1.friends[0],'里边储存的是全部信息') print(m1.friends[0].name) #能够额外调用名字,年龄等 print(m1.friends[0].age) w1.make_friends(m1) print(w1.friends[0].name)
多态实例1
1 # _*_coding:utf-8_*_ 2 3 4 class Animal(object): 5 def __init__(self, name): # Constructor of the class 6 self.name = name 7 8 def talk(self): # Abstract method, defined by convention only 9 pass 10 11 12 class Cat(Animal): 13 def talk(self): 14 print('%s: 喵喵喵!' % self.name) 15 16 17 class Dog(Animal): 18 def talk(self): 19 print('%s: 汪!汪!汪!' % self.name) 20 21 22 def talk_animal(obj): # 一个接口,多种形态 23 obj.talk() 24 25 26 d=Dog('www') 27 c=Cat('mmm') 28 d.talk() #一种接口 29 30 talk_animal(d) #另外一个接口 31 talk_animal(c)
多态实例2,类里开了接口
1 # _*_coding:utf-8_*_ 2 3 4 class Animal(object): 5 def __init__(self, name): # Constructor of the class 6 self.name = name 7 8 def talk(self): # Abstract method, defined by convention only 9 pass 10 @staticmethod #还没讲,这是个装饰器 11 def talk_animal(obj): # 这里加了个接口,放到类里了 12 obj.talk() 13 14 class Cat(Animal): 15 def talk(self): 16 print('%s: 喵喵喵!' % self.name) 17 18 19 class Dog(Animal): 20 def talk(self): 21 print('%s: 汪!汪!汪!' % self.name) 22 23 24 d=Dog('www') 25 c=Cat('mmm') 26 d.talk() #一种接口 27 28 Animal.talk_animal(d) 29 Animal.talk_animal(c)