面向对象
来源:互联网 发布:日程管理软件 知乎 编辑:程序博客网 时间:2024/06/07 19:10
面向对象
- 面向过程编程:(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是封装、继承、类。
- 面向对象编程(OOP)Object Oriented Programming
- 面向函数编程:(lisp)
(13+10)*2-10a = 13+10b = a*2c = b-10result = jian(multi(add(13,10),2),10)
思维导图:
以CS游戏中的角色为例,引入对象
role:警察,恐怖分子,人质
role1
name = "xxx"role = "警察"waepon="匕首"life_value = 100money=16000
role2
name = "xxx"role="恐怖分子"wepon="AK47"life_value = 100money=16000
role3
name = "xxx"role="人质"life_value = 100
def shot(user):
pass
警察类:
class Police: def get_info(self,name,role,life_value,weapon,money): self.name = name self.role = name def shot(): pass def jiu(): pass
class Kongbu: def shot(): pass def sha(): pass
class Renzhi: def get_info(): pass
类的实例化:
gaowenrui = Police()tanghao = Kongbu()zhoumengyang = Renzhi()
- 面向对象编程将对象作为程序的基本单元,对象包含了数据和方法组成。
- 类:在python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)。
- OOP首选考虑的不是程序的执行流程,而是某个数据类型应该被视为对象,其拥有自己的属性和方法。
- 方法:在对象中的定义的函数,可操作对象的属性。
class People(object): def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender ```- __init__方法在创建实例时,将属性绑上去,self代表实例本身。- 类的方法的第一个参数永远是实例变量self def marry(self): print "\t%s,%d岁,%s 开车去娶媳妇" % (self.name,self.age,self.gender) def cut(self): print "\t%s,%d岁,%s 上山砍柴" % (self.name,self.age,self.gender) def gohome(self): print "\t%s,%d岁,%s 辍学回家" % (self.name, self.age, self.gender)
laoli=People(“老李”,18,”男”)
xiao=People(“校思浩”,20,”男”)
tang=People(“唐浩”,10,”男”)
```- 在调用类中的方法时不需要传递self参数laoli.marry()xiao.cut()tang.gohome()
类的特性
- 封装性
- 继承性
- 多态性
封装性
- 封装是指向程序的其他部分隐藏对象的具体实现细节的原则。封装是可以不用关心对象是如何构建的而直接进行使用。
继承性
- 继承:对于面向对象来讲,就是将多个类共有的方法提取到父类中,而子类只需要继承父类的方法,不需要一一实现每个方法。
- 子类(派生类)、父类(基类)、经典类、新式类
1).多继承 - python的类可以继承多个父类,Java和C#只能单继承;
- 继承多个类,有两种算法,深度优先和广度优先算法;
- 类为经典类(class C:)时,多继承时使用深度优先算法;
- 类为新式类(class C(C1,C2))时,多继承时使用广度优先算法;
eg:D,C(D),B(D),A(B,C)
深度优先:A->B->D->C
广度优先:A->B->C->D 新式类:class D(object): 经典类:class D:
新式类:
class D(object): def eat(self): print "D"class C(D): def eat(self): print "C"class B(D): def eat(self): print "B"class A(B,C): passa=A()a.eat()
去掉B中的eat方法,运行结果如下:
class B(D): # def eat(self): # print "B" pass
- 经典类:
class D: def eat(self): print "D"class C(D): def eat(self): print "C"class B(D): def eat(self): print "B"class A(B,C): passa=A()a.eat()
运行结果:
去掉B中的eat方法,运行结果如下:
class B(D): # def eat(self): # print "B" pass
多态性
- 多态体现在多继承时,可以对不同类的对象使用同样的操作。
“鸭子类型“:当看到一只鸟走起来像鸭子,游泳起来像鸭子,叫起来也像鸭子,那么这只鸟就可以被称为鸭子。“鸭子类型“关注的不是对象的类型本身,而是它是如何使用的。
继承最大的好处是子类获得了父类的全部功能。
- 继承的另一个好处就是多态。子类中的方法和父类方法一样时,子类方法覆盖父类的方法。
获取对象的信息
- type()
a=A()print type(a)print type(A)
- isinstance()
class D(object): passclass B(D): passclass C(D): passclass A(B,C) passa=A()print isinstance(a,A|B|C|D)
- dir() #使用的是对象的继承关系来反馈一个对象的完整的有效属性。
a=A()print type(a)print type(A)print dir(A)print dir(a)print a.__doc__print a.__module__print a.__class__
访问限制
- 类的私有变量,类内部可以访问,外界无法访问
双下划线声明私有变量—-private - 类的内部定义中,所有以双下划线开始的名字都被“翻译“成前面加上单下划线和类名的形式。
1>可通过“实例._类名__方法|属性“进行访问
class C(object): def __eat(self): print "C"class B(object): passclass A(B,C): def fun(self): passa=A()a._C__eat()
2>子类的属性增加时,需要通过 Animal.init(self,name,age)
和super(Cat, self).init(name,age)
两种方法来继承基类的属性。
class Animal(object): # Animal:类,盖房的图纸 def __init__(self, name, age): # 构造函数,当实例化对象时自动调用,self实质是实例化后的对象本身 self.__name = name #__name是私有属性 self.__age = age # __age,私有属性 def setName(self, name): self.__name = name def getName(self): print self.__name def __run(self): #__run,私有方法 print "%s is running" % (self.__name) def eat(self): print "%s is eating......" % (self.__name) def __del__(self): #析构函数,删除实例化对象时自动调用 print "is delete......."class Cat(Animal): def __init__(self,name,age,color): Animal.__init__(self,name,age) #super(Cat, self).__init__(name,age) self.color = color def eat(self): print "%s is eating fish....." %(self._Animal__name) passclass Dog(Animal): passtom = Cat("fentiao", 6)print tom._Animal__nametom.eat()tom._Animal__run()
阅读全文
0 0
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- 面向对象
- Android O 编译变化
- 《maven实战》中Kaptcha包安装问题
- 百练Distance On ChessBoard
- mysql 5.7中的用户权限分配
- 恶意样本分析手册——API函数篇
- 面向对象
- MPEG2/TS 包结构简述
- 全面理解虚拟DOM,以及通过diff算法实现真正的虚拟DOM操作
- Android Studio如何引入jar包和so库?
- google的gson三方包混淆问题,附上通用proguard-rules.pro
- iOS字体大小适配的几种方法
- Sublime Text3和JSON解析插件安装
- Arduino智能小车——循迹篇
- 一个响应式网页导航条