python对象编程例⼦-Python3.5⾯向对象编程图⽂与实例详解本⽂实例讲述了Python3.5⾯向对象编程。分享给⼤家供⼤家参考,具体如下:
1、⾯向过程与⾯向对象的⽐较
(1)⾯向过程编程(procedural programming)
⾯向过程编程⼜被称为:top-down languages,程序从上到下 ⼀步步执⾏,从头到尾的解决问题。
基本设计思路为:程序⼀开始是解决⼀个⼤问题,然后把⼤问题分解成多个⼩问题或⼦过程,这些⼩问题执⾏的时候再继续分解,
直到⼩问题⾜够简单到可以在⼀个⼩范围内解决。
缺点:若程序要进⾏修改,则修改的部分依赖的各个部分也要修改,这样会发⽣⼀连串的影响,随着程序越来越⼤,编程⽅式的维护难度也会越来越⾼。
所以,如果写⼀下简单的脚本,去做⼀些⼀次性的任务,⽤⾯向过程的⽅式是极好的,如果要处理的任务是复杂的,且需要不断迭代和维护的,还是⽤⾯向对象是最⽅便的。
(2)⾯向对象编程(oop)
⾯向对象编程是利⽤“类”和“对象”来创建各种模型来实现对真实世界的描述。
优点:可以使程序的维护和扩展变得简单,并且可以⼤⼤提⾼程序的开发效率;另外,基于对象的程序编程,可以让别⼈更加理解你的代码逻辑,是团队开发变得更加从容。
核⼼的特征:世界万物皆对象,世界万物皆可分类。
a、类(class)
类:是对⼀类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象都具备的属性、共同的⽅法。
b、对象(object)
对象:类实例化后的实例,⼀个类必须经过实例化⽅能在程序中调⽤。
⼀个类可以实例化多个对象,每个对象可以有不同的属性。⼈类是指使⽤的⼈,每个⼈是指具体的对象。
c、封装(encapsulation)
在类中对数据的赋值、内部调⽤对外部⽤户是透明的,这使类变成了⼀个胶囊或容器,⾥⾯包含着类的数据和⽅法。
d、继承(Inheritance)
⼀个类可以派⽣出⼦类,在这个⽗类⾥定义的属性、⽅法⾃动被⼦类继承。
e、多态(Polymorphism)
多态:是⾯向对象的重要特性,简单点说:“⼀个接⼝,多种实现”,指⼀个基类中派⽣出了不同的⼦类,
且每个⼦类在继承了同样的⽅法名的同时⼜对⽗类的⽅法做了不同的实现,这就是同⼀种事物表现出的多种形态。
编程其实就是⼀个将具体世界进⾏抽象化的过程,多态就是抽象化的⼀种体现。
把⼀系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进⾏对话。
多态允许将⼦类的对象当作⽗类的对象使⽤,某⽗类型的引⽤指向其⼦类型的对象,调⽤的⽅法是该⼦类型的⽅法。
这⾥引⽤和调⽤⽅法的代码编译前就已经决定了,⽽引⽤所指向的对象可以在运⾏期间动态绑定。
2、⾯向对象编程
(1)⽆论什么形式的编程,都要明确⼀下原则:写重复的代码是⾮常不好的地级⾏为;之前写的代码需要不断的更新。
所以,开发的程序要遵循易读、易改的原则,即:可读性好、易扩展。
(2)⽰例代码:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
#⾯向对象--CS游戏模拟
class Role(object):
def __init__(self,name,role,weapon,life_value=100,money=15000):
self.name = name
self.weapon = weapon
self.life_value = life_value
< = money
def shot(self):
print("")
def got_shot(self):
print("ah...%s " %self.name)
def buy_gun(self,gun_name):
print("%s just bought %s" %(self.name,gun_name))
r1 = Role("Jack","police","AK-47") #实例化(初始化⼀个类,创建了⼀个对象)
r1.buy_gun("B51")
r2 = Role("Amy","terrorist","B22")
<_shot()
运⾏结果:
Jack just bought B51
注:
a、类的基本定义
第⼀句:定义⼀个类,class是定义类的语法,Role是类名,(object)是新式类的写法,必须这样写;
第⼆句:__init__()叫做初始化⽅法,也叫构造⽅法(虽然它是函数的形式,但在类中就不叫函数了,叫做⽅法),在类被调⽤时这个⽅法会⾃动执⾏,进⾏⼀些初始化动作,
所以__init__(self,name,role,weapon,life_value=100,money=15000)就是要在创建⼀个⾓⾊时给它设置这些属性。
b、实例化:把⼀个类变成⼀个具体的对象的过程叫实例化。
在这⾥,实例化⽣成⼀个⾓⾊,会⾃动把参数传给类Role下⾯的__init__(...)⽅法。
初始化⼀个⾓⾊,就需要调⽤这个类⼀次;上⾯的创建⾓⾊时,并没有给__init__(...)传值,是因为类在调⽤它⾃⼰的__init__(...)是⾃⼰帮你给self参数赋值了。
执⾏r1 = Role('liu','police','AK47')时,python的解释器其实⼲了两件事:
1、 在内存中开辟⼀块空间指向r1这个变量名。
2、 调⽤Role这个类并执⾏其中的__init__(…)⽅法,相当于Role.__init__(r1,'Jack','police','AK47'),这么做是为什么呢?
是为了把'Jack','police','AK47'这3个值跟刚开辟的r1关联起来,因为关联起来后,你就可以直接r1.name, r1.weapon 这样来调⽤。
所以,为实现这种关联,在调⽤__init__⽅法时,就必须把r1这个变量也传进去,否则__init__不知道要把那3个参数跟谁关联。
所以这个__init__(…)⽅法⾥的,self.name = name , le = role 等等的意思就是要把这⼏个值 存到r1的内存空间⾥。
结:self就是⽰例本⾝,实例化时Python会⾃动把这个⽰例本⾝通过self参数传递进去。
r1.buy_gun("B51")===》Python会⾃动转换成:Role.buy_gun(r1,"B51”)
依然没给self传值 ,但Python还是会⾃动的帮你把r1 赋值给self这个参数, 为什么呢? 因为,你在buy_gun(..)⽅法中可能要访问r1的⼀些其它属性,
⽐如这⾥就访问 了r1的名字,怎么访问呢?你得告诉这个⽅法,于是就把r1传给了这个self参数,然后在buy_gun⾥调⽤ self.name 就相当于调⽤r1.name ,
如果还想知道r1的⽣命值 有多少,直接写成self.life_value就可以了。
总结:
a、上⾯的这个r1 = Role('Alex','police','AK47')动作,叫做类的“实例化”, 就是把⼀个虚拟的抽象的类,通过这个动作,变成了⼀个具体的对象了, 这个对象就叫做实例。
b、刚才定义的这个类体现了⾯向对象的第⼀个基本特性,封装,其实就是使⽤构造⽅法将内容封装到某个具体对象中,然后通过对象直接或者self间接获取被封装的内容。
3、实例变量与类变量
(1)类变量:存在类的内存中,没有实例化即可使⽤;实例化后,通过实例也可调⽤类变量。作⽤:共⽤的属性,节省开销。
(2)实例变量:描述某个具体对象⼀些特定的属性,只能在实例本⾝中使⽤。
(3)区别:若⼀个类中,既有类变量name,⼜有实例变量name,则先实例变量,实例变量没有的情况下,再类变量。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
#⾯向对象--CS游戏模拟
class Role(object):
n = 123 #类变量
def __init__(self,name,role,weapon,life_value=100,money=15000):
#构造函数
#作⽤:在实例化时做⼀些类的初始化⼯作
python新手代码示例
self.name = name #实例变量(静态属性),作⽤域就是实例本⾝
self.weapon = weapon
self.life_value = life_value
< = money
def shot(self): #类的⽅法(功能)--动态属性
print("")
def got_shot(self):
print("ah...%s " %self.name)
def buy_gun(self,gun_name):
print("%s just bought %s" %(self.name,gun_name))
#r1是类Role的⼀个实例化对象
# 实例化就是以类Role为模板,在内存开辟⼀块空间,存上数据,赋值成⼀个变量名
#实例化(初始化⼀个类,创建了⼀个对象)
r1 = Role("Jack","police","AK-47") #此时self相当于r1,Role(r1,"Jack","police","AK-47") r1.buy_gun("B51") #r1也被称作Role的⼀个实例
r1.name = "liu" #修改r1的实例变量
r1.n = "改变类变量" #在r1中修改类变量n的值,相当于创建⼀个n,不会影响r2
r1.bullet_prove = True #添加新的属性,只能在r1中使⽤
print(r1.n)
r2 = Role("Amy","terrorist","B22") #此时self相当于r2,Role(r2,"Amy","terrorist","B22") r2.got_shot()
print(r2.n)
Role.n = "abc" #通过类名修改类变量的值
print("r1:",r1.n)
print("r2:",r2.n)
运⾏结果:
liu just bought B51
改变类变量

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。