一、封装

1)封装:是面向对象的一大特点;将属性和方法封装在一个抽象类中。外界使用类创建对象,然后让对象调用内部方法。对象方法的细节都被封装在类的内部。


class Person():

  def __init__(self,name,weight):    # 初始化方法

      self.name = name

      self.weight = weight

  def __str__(self):     # 定义返回方法

      return 'my name is %s,my weight is %.2f.' %(self.name,self.weight)

  def run(self):        # 定义跑步方法

      self.weight -= 0.5

      print '每次跑步会减重0.5公斤。'

  def eat(self):       # 定义吃方法

      self.weight += 1.0

      print '每次吃东西会增重1.0公斤'

# 创建类的实例化对象,并调用方法 

ming = Person('小明',65)

ming.run()

ming.eat()

print ming

 

lili = Person('lili',45)

lili.run()

print lili


2)举例1:

    需求:摆放家具

    1、房间有户型,总面积和家具名称列表。新房间五家具

    2、家具上有名字和占地面积

    3、将家具添加在房子中

解析如下:

 # 定义一个家具类。有姓名和占地面积的属性; 

class fortn():

   def __init__(self,name,area):

        self.name = name

        self.area = area

   def __str__(self):

        return '%s的占地面积是%.2f' %(self.name,self.area)

# 定义房子类。有户型、总面积、剩余面积、家具的属性;方法为添加家具

class home():

   def __init__(self,name,area):

       self.name = name

       self.area = area

       self.leaveArea = area   # 剩余面积初始值为总面积

       self.fortn_list = []

   def __str__(self):

       return '户型:%s ,总面积:%.2f ,剩余面积:%.2f , 家具:%s' %(self.name,self.area,self.leaveArea,self.fortn_list)

   def add_thing(self,argc):

       print "要添加%s"  %argc.name

       if self.leaveArea < argc.area:

           print "%s占地面积太大,不能添加" %argc.name

           return

       self.fortn_list.append(argc.name)

       self.leaveArea -= argc.area

 

# 创建家具对象

bed = fortn('bed',4)

chest = fortn('chest',2)

table = fortn('table',1.5)

# 创建房子对象

my_house = home('两室一厅',200)

my_house.add_thing(bed)

my_house.add_thing(chest)

my_house.add_thing(table)

print my_house 


举例2:

    需求:士兵有枪,当枪里有子弹才可以射击

解析如下:

# 创建枪类

class  Gun():

   def __init__(self,model):

       self.model = model

       self.bullet_count = 0

   def shoot(self):

       if self.bullet_count <= 0:

           print "%s没有子弹" %self.model

           return 

       self.bullet_count -= 1

       print '发射一次,子弹还有%s' %self.bullet_count

   def add_bullet(self,count):

       self.bullet_count += count

# 创建士兵类

class Sodlier():

   def __init__(self,name):

       self.name = name

       self.gun = None    # 当属性不确定的时候,可以使用None来初始化

   def fire(self):

       if self.gun == None:

           print "%s还没有枪" %self.name

       print "go to fire!%s" %self.name

       self.gun.add_bullet(10)

       self.gun.shoot()

 

# 定义枪对象

ak47 = Gun('AK47')

# ak47.add_bullet(10)

# ak47.shoot()

 

# 定义士兵对象

ryan = Soldier('Ryan')

ryan.gun = ak47

ryan.fire()

print ryan.gun

二、继承

1)继承实现的是代码的重用,相同部分代码不需要重写,分为单继承和多继承。多继承:一个子类可以继承多个父类。

  2)单继承:一个子类只能继承一个父类

 # 定义父类

class Animal():

   def call(self):

       print "我会叫"

   def run(self):

       print "我会跑"

# 定义子类Cat,并重写父类的call方法

class Cat(Animal):

   def call(self):  # 由于和父类中的call方法重名,所以实现重写

      print "我会喵喵叫~~~"

# 定义HelloKitty子类,继承Cat类

class HelloKitty(Cat):

    def speak(self):

        print "我会说"

# 创建对象

tom = HelloKitty()

tom.run()           # 在子类中没有定义run方法,但在父类和祖父类中有

tom.call()         

tom.speak()

3)多继承:一个子类可以有多个父类

# 定义父类1

class  A():

   def test(self):

       print "A ---> test"

   def demo(self):

       print "A ---> demo"

# 定义父类2

class B():

   def test(self):

       print "B ---> test"

   def demo(self):

       print "B ---> demo"

# 定义子类C,继承父类A和B的方法和属性

class C(A,B):

   # 当父类中的方法同名时,按括号中父类的先后顺序继承

   pass

# 定义子类的实例化对象

c = C()

c.test()    # 此时调用的均为父类A的结果

c.demo()

  4)继承中的重写问题:在开发过程中,若父类方法和子类方法的实现完全不同,可以重写父类方法,实现方法覆盖。

# 定义父类

class Animal():

   def call(self):

       print "我会叫"

   def run(self):

       print "我会跑"

# 定义子类Cat,并重写父类的call方法

class Cat(Animal):

   def call(self):  # 由于和父类中的call方法重名,所以实现重写

      print "我会喵喵叫~~~"

tom.run()     # 此时可以使用创建出来的对象,调用父类的方法

# 创建对象

tom = Cat()

tom.call()           # 此时,调用call显示的为:我会喵喵叫

  5)继承中的扩展问题

# 定义父类

class Animal():

   def call(self):

       print "我会叫"

   def run(self):

       print "我会跑"

# 定义子类Cat,并重写父类的call方法

class Cat(Animal):

   def call(self):  # 由于和父类中的call方法重名,所以实现重写

       print "我会喵喵叫~~~"

# 创建对象

tom = Cat()

tom.call()           # 此时,调用call显示的为:我会喵喵叫

三、多态

  1)同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果

class Dog(object):

   def __init__(self,name):

       self.name = name

   def game(self):

       print "%s是一只普通的狗" %self.name

class amazing(Dog):

   def game(self):

       print "%s是一只神奇的狗" %self.name

class Person(object):

   def __init__(self,name):

       self.name = name

   def game_with_dog(self,dog):

       print "%s和%s快乐地玩耍" %(self.name,dog.name)

       dog.game()

wangcai = amazing("旺财")

xiaoming = Person("小明")

xiaoming.game_with_dog(wangcai)

Python面向对象的三大特征 --- 封装、继承、多态的更多相关文章

  1. JAVA的三大特征 封装继承多态- 简单总结

    简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...

  2. python 面向对象的三大特征之 继承

    #继承 #object 基类,是python定义的所有类的父类 #经典类:不继承object的类称作经典类 #新式类:继承object的类称作新式类 #python 3.x统一为新式类 #经典类是类对 ...

  3. python面向对象的三大特征--封装

    #coding:utf-8 __author__="tang" #第一个层面的封装:类就是麻袋,本身就是一种封装 #第二个层面的封装:类中定义私有的,只在类的内部使用,外部无法访问 ...

  4. Python面向对象初始(三大特征,多态,继承,封装)

    Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...

  5. Python - 面向对象编程 - 三大特性之继承

    继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...

  6. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  7. OOP三大核心封装继承多态

    OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...

  8. python面向对象的三大特征

    1.封装: 封装就是对类和对象的成员访问进行限制,设定可以访问的方式和不可以访问的方式. 分类: 私有化的封装:当前类/对象种可以使用,类/对象外和子类/对象都不可以用 受保护的封装:当前类/对象和子 ...

  9. C++三大特性 封装 继承 多态

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

随机推荐

  1. JS正则表达式从入门到入土(6)—— 贪婪模式与非贪婪模式

    贪婪模式 之前说了正则的量词,但是量词会带来一个到底该匹配哪个的问题. 如下正则表达式: \d{3,6} 这个正则表达式是匹配3到6个数字,但是当这个正则表达式被用来匹配12345678这个字符串,到 ...

  2. 自制mysql的rpm包

    MySQL安装一般使用RPM或者源码安装的方式.RPM安装的优点是快速,方便.缺点是不能自定义安装目录.如果需要调整数据文件和日志文件的存放位置,还需要进行一些手动调整.源码安装的优点是可以自定义安装 ...

  3. nginx和php之间是怎样通信的呢?

    FastCGI原理 FastCGI是一个运用于Http Server和动态脚本语言间通信的接口,多数流行的Http Server都支持FastCGI,包括Apache.Nginx和lighttpd等. ...

  4. MysQL使用一高级应用(下)

    连接查询 连接查询分类如下: 表A inner join 表B:表A与表B匹配的行会出现在结果中 表A left join 表B:表A与表B匹配的行会出现在结果中,外加表A中独有的数据,未对应的数据使 ...

  5. Linux系统CentOS使用yum方式安装指定版本的PHP 添加yum源 从PHP5.3升级到5.4/5.5/5.6

    默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 首先删除旧版本的PHP, 通过yum list installed | grep php可以查看所有已安装的php软件 使 ...

  6. detectron——test 错误集锦

    一.测试错误,运行如下代码 python2 tools/test_net.py --cfg experiments/e2e_faster_rcnn_resnet--FPN_pascal2007.yam ...

  7. 数据结构实习 problem O Huffman Tree

    Huffman Tree 题目描述 对输入的英文大写字母进行统计概率 然后构建哈夫曼树,输出是按照概率降序排序输出Huffman编码. 输入 大写字母个数 n 第一个字母 第二个字母 第三个字母 .. ...

  8. spring-boot 加入拦截器Interceptor

    1.spring boot拦截器默认有 HandlerInterceptorAdapter AbstractHandlerMapping UserRoleAuthorizationIntercepto ...

  9. 关于JBoss的一些项目配置

    1. 如何使用 IP:port 的形式访问项目 : [1] 在standalone.xml文件中,查找<interfaces>标签,添加如下节点 : <interface name= ...

  10. mysql数据库优化课程---13、mysql基础操作

    mysql数据库优化课程---13.mysql基础操作 一.总结 一句话总结:mysql复制表,索引,视图 1.mysql如何复制表? like select * 1.复制表结构 create tab ...