面向对象

面向对象

  • 面向过程编程:(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是封装、继承、类。
  • 面向对象编程(OOP)Object Oriented Programming
  • 面向函数编程:(lisp)
(13+10)*2-10
a = 13+10
b = a*2
c = b-10

result = jian(multi(add(13,10),2),10)

思维导图:
这里写图片描述

以CS游戏中的角色为例,引入对象

role:警察,恐怖分子,人质

role1

name = "xxx"
role = "警察"
waepon="匕首"
life_value = 100
money=16000

role2

name = "xxx"
role="恐怖分子"
wepon="AK47"
life_value = 100
money=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):
    pass

a=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):
    pass

a=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):
    pass

class B(D):
    pass

class C(D):
    pass

class A(BC)
    pass
a=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):
    pass

class A(B,C):
    def fun(self):
        pass

a=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)

    pass


class Dog(Animal):
    pass


tom = Cat("fentiao", 6)
print tom._Animal__name
tom.eat()
tom._Animal__run()

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值