面向对象

面向对象编程

以前学的都都是面向过程编程,我理解的面向过程就是写好流程图,跟着流程图一步一步走,实现功能。

面向对象是你是一个上帝,滴尿成湖,泼尿成海,创造万物,赋予他们属性,调用他们的功能,实现我们的目的。

面向对象的几个核心特性如下

Class 类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法

class a: #经典类

class a(object)#新式类

 

Object 对象 
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同

就是实力话一个对象。。。。。

 

Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法

 

常用方法:

析构函数

在实例释放、销毁的时候执行,通常进行收尾工作,如果关闭一些数据库连接,打开的临时文件

语法:

    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)

 

posted @ 2018-05-02 17:19  人无远虑  阅读(187)  评论(0编辑  收藏  举报