鱼C论坛

 找回密码
 立即注册
查看: 2275|回复: 0

[技术交流] 36 类和对象:继承 - 景命

[复制链接]
发表于 2017-8-21 22:38:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
知识点:
语法:
class DerivedClassName(BaseClassName)
                子类名                     父类名


一、一个子类可以继承它父类的所有属性和方法。
例:
  1. class Parent():
  2.     def hello(self):
  3.         print("你好啊~")

  4. class Child(Parent):        #孩子类继承父亲类。
  5.     pass

  6. p = Parent()
  7. p.hello()

  8. c = Child()
  9. c.hello()                #孩子类的对象同样可以调用父亲类的方法。

  10. 你好啊~                #父类对象调用方法后输出的结果
  11. 你好啊~                #子类对象调用方法后输出的结果
复制代码



二、如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性。
例:
  1. class Parent():
  2.     def hello(self):
  3.         print("你好啊~")

  4. class Child(Parent):
  5.     def hello(self):                #在子类中定义了与父类重名的方法。
  6.         print("^_^")
  7.     pass

  8. p = Parent()
  9. p.hello()

  10. c = Child()
  11. c.hello()

  12. 你好啊~
  13. ^_^                        #子类对象调用方法后输出的结果与父类不一致。
复制代码



三、调用未绑定的父类方法和super()函数

先看例子(不懂看注释啊^_^)
  1. import random as r
  2. class Fish():                        #在此处定义父类。
  3.     def __init__(self):
  4.         self.x = r.randint(0,10)
  5.         self.y = r.randint(0, 10)
  6.         print("我现在的位置是【%d,%d】" %(self.x,self.y))

  7.     def move(self):
  8.         self.x -= 1
  9.         print("我移动【%d,%d】的位置了" %(self.x,self.y))


  10. class Shark(Fish):                #定义子类
  11.     hunger = True
  12.     def __init__(self):                #在这里重写了__init__()方法。
  13.         if self.hunger:
  14.             print("吃的好饱啊!")
  15.             self.hunger = False
  16.         else:
  17.             print("不能再吃了,撑死了!")

  18. s = Shark()                        #实例化子类对象
  19. s.move()                                #调用继承到的方法。

  20. #下面的输出结果是异常。
  21. 吃的好饱啊!
  22. Traceback (most recent call last):
  23.   File "E:/Python/第038讲.类和对象:继承/实验.py", line 48, in <module>
  24.     s.move()
  25.   File "E:/Python/第038讲.类和对象:继承/实验.py", line 23, in move
  26.     self.x -= 1
  27. AttributeError: 'Shark' object has no attribute 'x'
复制代码

        在上面的例子中虽然子类继承了父类,但是调用父类中的方法却报错了。原因是因为,在子类中重写了__init__()方法,所以导致了方法move()中缺少参数。

解决方法有两种:
        1)调用未绑定的父类方法
                用父类对象的对象名调用父类中的__init__()方法,参数却为子类的实例化对象(此时调用的方法就叫未绑定的父类方法)。这样就可以实现即重写父类中的方法,又可以使用父类中的方法。
  1. class Shark(Fish):
  2.     hunger = True
  3.     def __init__(self):
  4.         Fish.__init__(self)                #在这里用父类对象调用父类中的__init__()方法。
  5.         if self.hunger:
  6.             print("吃的好饱啊!")
  7.             self.hunger = False
  8.         else:
  9.             print("不能再吃了,撑死了!")
  10. 其实就相当于这样写:
复制代码

        其实就相当于这样写:
  1. s = Shark()
  2. Fish.__init__(s)
  3. s.move()
复制代码

       
        2)使用super()函数
        使用super()函数可以帮我们自动找到父类的方法,并且自动传入self(也就是子类对象)参数。
        supper()函数的超级之处就在于,你不用给任何父类的名字(可能存在多个父类或者有好多个祖先类),它会自动帮你一层层找出它所有父类中对应的方法。
        由于你不用给出父类的名字,这就意味着你如果需要改变了类继承关系,你只要改变class语句里的父类即可,而不必在大量代码中去修改所有被继承的方法。

        语法:
                super().需要的父类的方法名()                #注意括号内不用加self

  1. class Shark(Fish):
  2.     hunger = True
  3.     def __init__(self):
  4.         super().__init__()
  5.         if self.hunger:
  6.             print("吃的好饱啊!")
  7.             self.hunger = False
  8.         else:
  9.             print("不能再吃了,撑死了!")
复制代码




四、多重继承
多重继承看起来很厉害,但是很容易导致代码混乱。所以尽量避免使用它。
  1. class A:
  2.     def __init__(self):
  3.         print("我是类A")

  4. class B:
  5.     def __init__(self):
  6.         print("我是类B")

  7. class C(A,B):                #类C同时继承类A和类B
  8.     pass

  9. c = C()

  10. #下面是输出结果
  11. 我是类A                                #如果父类中的方法名相同那么会调用前面的那个类中的方法。
复制代码

评分

参与人数 1鱼币 +6 收起 理由
小甲鱼 + 6 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-4 09:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表