前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >继承(第十三章)

继承(第十三章)

作者头像
天钧
发布2019-07-26 17:16:34
3500
发布2019-07-26 17:16:34
举报
文章被收录于专栏:渗透云笔记

语法

代码语言:javascript
复制
class 类名(被继承的类):
  .....

看代码,其实很好理解

代码语言:javascript
复制
>>> class Parent:
...     def hello(self):
...             print("正在调用父类方法")
...
>>> class Child(hello):
...     pass
...
>>> p = Parent()
>>> p.hello()
正在调用父类方法
>>> c = Child()
>>> c.hello()
正在调用父类方法
>>>

嗯哼哼?其实就相当于就用,继承者相当于子类,pass是什么,空的意思方便大家理解,官方点就是占位符

看一个吃鱼的小游戏(源代码)

代码语言:javascript
复制
import random as r#调用


class Fish:#一个类
    def __init__(self):#还记得上一章的魔法方法吗__init__可以实实例化对像来代入参数
      self.x = r.randint(0,10)
      self.y = r.randint(0,10)

    def move(self):
        self.x -=1
        print("我的位置是",self.x,self.y)
    def goldfish(Fish):
        pass

    def carp(Fish):
        pass

    def Salmon(Fish):
        pass
class Shark(Fish):#定义鲨鱼,一个傻鲨鱼
    def __init__(self):#这里会讲到调用未绑定的父类方法
        self.hungry = True
    def eat(self):
        if self.hungry:
            print("我是个大吃货")
            self.hungry = False
        else:
            print("饱了,不吃了")

运行后,发现鲨鱼报错了

代码语言:javascript
复制
>>> fish = Fish()
>>> fish.move()
我的位置是 2 7
>>> shark = Shark()
>>> shark.move()
Traceback (most recent call last):
  File "<pyshell#94>", line 1, in <module>
    shark.move()
  File "C:/Users/Administrator/Desktop/魔法方法.py", line 10, in move
    self.x -=1
AttributeError: 'Shark' object has no attribute 'x'
>>> 

原因是,调用__init__时重新定义,无法实现移动 改下代码

完美

这里的self是子类的self而不是父类的self替代

代码

代码语言:javascript
复制
class Shark(Fish):
    def __init__(self):
        Fish.__init__(self)
        self.hungry = True
    def eat(self):
        if self.hungry:
            print("我是个大吃货")
            self.hungry = False
        else:
            print("饱了,不吃了")

有没有更好的方法呢?

有的super函数

代码语言:javascript
复制
class Shark(Fish):
    def __init__(self):
        super().__init__()
        self.hungry = True
    def eat(self):
        if self.hungry:
            print("我是个大吃货")
            self.hungry = False
        else:
            print("饱了,不吃了")

运行如下

代码语言:javascript
复制
>>> shark = Shark()
>>> shark.move()
我的位置是 4 9

直接原话开始解释

super的超级之处在于你不许要明确的给出任何基类的名字,他会自动的帮你找出所有基类以及对应的方法。意味着如果需要改变类的继承关系,只需要改变class语句里的父类即可。

多重继承

语法

代码语言:javascript
复制
class 类名(父类1,父类2,父类3......)
.......

看代码,秒懂

代码语言:javascript
复制
class Base1:
    def fool(self):
        print("我是fool,我在Basel中")

class Base2:
    def foo2(self):
        print("我是foo2,我在Basel中")

class Cat(Base1,Base2):
    pass

运行后

代码语言:javascript
复制
>>> cat = Cat()
>>> cat.fool()
我是fool,我在Basel中
>>> cat.foo2()
我是foo2,我在Basel中
>>> 

当然不建议使用的,会造成bug的

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 渗透云笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档