面向对象

编程范式

编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 ,不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路, 两种最重要的编程范式分别是面向过程编程和面向对象编程。

面向过程编程

就是程序从上到下一步步执行,一步步从上到下,从头到尾的解决问题 。基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个小问题或子过程,这些子过程再执行的过程再继续分解直到小问题足够简单到可以在一个小步骤范围内解决。

这样做的问题也是显而易见的,就是如果你要对程序进行修改,对你修改的那部分有依赖的各个部分你都也要跟着修改。

 

面向对象编程

OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述。

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

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

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

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

Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承

Polymorphism 多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。
编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。
对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。
多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定

 OOP编程的主要作用也是使你的代码修改和扩展变的更容易

无论用什么形式来编程,我们都要明确记住以下原则:
  1. 写重复代码是非常不好的低级行为
  2. 你写的代码需要经常变更

简单例子:

class Dog:
    def __init__(self,name):
        self.name = name

    def bulk(self):
        print(" wang wang wang!" )

d1 = Dog()
d2 = Dog()

d1.bulk()
d2.bulk()

-------------------------
增加参数
class Dog:
    def __init__(self,name):
        self.name = name

    def bulk(self):
        print("%s: wang wang wang!" % self.name)

d1 = Dog("陈荣华")
d2 = Dog("陈三炮")

d1.bulk()
d2.bulk()

cs游戏示例:

封装

class Role(object):
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money
 
    def shot(self):
        print("shooting...")
 
    def got_shot(self):
        print("ah...,I got shot...")
 
    def buy_gun(self,gun_name):
        print("just bought %s" %gun_name)
 
r1 = Role('Alex','police','AK47’) #生成一个角色
r2 = Role('Jack','terrorist','B22’)  #生成一个角色

 

 

构造函数:

class Role:
    n = 123 #类变量
    n_list = []
    name = "我是类name"
    def __init__(self, name, role, weapon, life_value=100, money=15000):
        #构造函数
        #在实例化时做一些类的初始化的工作
        self.name = name   #r1.name=name实例变量(静态属性),作用域就是实例本身
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money
    
    def shot(self): # 类的方法,功能 (动态属性)
        print("shooting...")

    def got_shot(self):
        self.__life_value -=50
        print("%s:ah...,I got shot..."% self.name)

    def buy_gun(self, gun_name):
        print("%s just bought %s" % (self.name,gun_name) )


#把一个类变成一个具体对象的过程叫 实例化(初始化一个类,造了一个对象)
r1 = Role('Alex','police','AK47’) #生成一个角色
r2 = Role('Jack','terrorist','B22’)  #生成一个角色
r1.buy_gun("AK47")
r1.got_shot()

#  如果有类变量和实例变量  先找实例变量 没有再找类变量
# print(Role.n)       ---->123
# print(r1.n ,r1.name )  --->123  Alex

#修改实例变量
# r1.name = "陈荣华"   实际上相当于self.name = name 
# print(r1.n ,r1.name )  --->123  陈荣华


#增加新属性  
r1自己的属性 即使没有初始化过程 也有 但是r2没有这个属性
r1.bullet_prove = True   实际上相当于self.name = name 
print(r1.n ,r1.name,r1.bullet_prove )  --->123  陈荣华   True

#删除属性
print(r1.n ,r1.name,r1.bullet_prove ,r1.weapon)  --->123   陈荣华   True AK47
#del r1.weapon
print(r1.n ,r1.name,r1.bullet_prove ,r1.weapon)   --->x

#修改类变量
r1.n = "改类变量"
print(r1.n)   --->改类变量
print(r2.n)    --->123 
print(Role.n)      --->123 


Role.n = "ABC"
print(r1.n)   --->改类变量
print(r2.n)    --->ABC
print(Role.n)      --->ABC

r1.n_list.append("from r1")
r2.n_list.append("from r2")
print(r2.n_list)  --->[from r1,from r2]
print(Role.n_list)  --->[from r1,from r2]

 

类变量的用途? 大家共用的属性 ,节省开销

class Person:
         def __init__(self,name,age,addr,cn="china")
         self.name = name
         self.cn = cn
p1 = Person(name,age ,addr)


---------------------------------
class Person:
     cn = "中国"
     def __init__(self,name,age,addr)
         self.name = name
p1 = Person(name,age ,addr)

 


析构函数:

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

析构函数无需调用 自动执行      在程序退出释放内存  或  删除对象del 时 自动执行

class Role:
    def __init__(self, name, role, weapon, life_value=100, money=15000):
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money
   #析构函数
   def __del__(self):
        pass #print("%s 彻底死了。。。。" %self.name)

    def show_status(self):
        print("name:%s weapon:%s life_val:%s" %(self.name,
                                                 self.weapon,
                                                self.__life_value))
    def shot(self): 
        print("shooting...")

    def got_shot(self):
        self.__life_value -=50
        print("%s:ah...,I got shot..."% self.name)

    def buy_gun(self, gun_name):
        print("%s just bought %s" % (self.name,gun_name) )

r1 = Role('Chenronghua', 'police',  'AK47')
r1.buy_gun("AK47")
r1.got_shot()
del r1

 

 

私有方法,私有属性

class Role:
    def __init__(self, name, role, weapon, life_value=100, money=15000):
        self.name = name
        self.role = role
        self.weapon = weapon
        self.__life_value = life_value  #增加两个下划线
        self.money = money
  
 
    def __shot(self): #增加两个下划线  对外面不可见
        print("shooting...")

    def show_status(self):#在内部可以修改访问
        print("name:%s weapon:%s life_val:%s" %(self.name,
                                                 self.weapon,
                                                self.__life_value))

r1.__shot()    --》xx
print(r1.show_status())  ---》  name:。。 weapon:。。 life_val:100

 

posted @ 2018-12-20 22:08  hmm1995  阅读(146)  评论(0)    收藏  举报