【零基础入门学习python】类和对象:继承

继承的简单例子

class Parent:
    def hellow(self):
        print("正在调用父类的方法")

class Child(Parent):
    def hi(self):
        print("正在调用子类的方法...")

>>> c = Child()
>>> c.hellow()
正在调用父类的方法
>>> c.hi()
正在调用子类的方法...

如上,定义的一个子类的方法

class 子类名(父类名):

注意:如果子类中,定义与父类相同的属性和方法,则会自动覆盖父类的属性和方法。

看下面的例子

import random as r

class Fish:
    def __init__(self):
        self.x = r.randint(0,10)
        self.y = r.randint(0,10)

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

class Goldfish(Fish):
    pass

class Carp(Fish):
    pass

class Shark(Fish):
    def __init__(self): # 这里是重写了init方法,父类的方法被覆盖了。
        self.hungry = True

    def eat(self):
        if self.hungry:
            print("有吃的了,开吃啦...^_^ ")
            self.hungry = False
        else:
            print("太撑了,不吃了...") 

运行结果:

>>> g = Goldfish()
>>> g.move()
我现在的位置是: 6 6
>>> g.move()
我现在的位置是: 5 6
>>> s = Shark()
>>> s.eat()
有吃的了,开吃啦...^_^ 
>>> s.eat()
太撑了,不吃了...
>>> s.move()
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    s.move()
  File "C:\Users\Administrator\Desktop\鱼c\继承.py", line 9, in move
    self.x -= 1
AttributeError: 'Shark' object has no attribute 'x'

可以看到,Shark()不能成功的继承,为什么呢?

仔细看,,会发现,Shark里面重写了__init__(self)方法,所以,父类中的__init(self)方法被覆盖掉了。

怎么解决?常见的有以下两种方案:

(1)调用未绑定的父类方法

(2)调用super()函数

import random as r

class Fish:
    def __init__(self):
        self.x = r.randint(0,10)
        self.y = r.randint(0,10)

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

class Goldfish(Fish):
    pass

class Carp(Fish):
    pass

class Shark(Fish):
    def __init__(self): # 这里是重写了init方法,父类的方法被覆盖了。
        #Fish.__init__(self) # 调用未绑定的父类的方法:这里self不是父类的,是子类的
        super().__init__() # 使用super()函数:自动查找父类,
        self.hungry = True

    def eat(self):
        if self.hungry:
            print("有吃的了,开吃啦...^_^ ")
            self.hungry = False
        else:
            print("太撑了,不吃了...")

推荐使用super()函数。

多继承

直接上例子

>>> class Base1:
    def print1(self):
        print("我是base1...")

        
>>> class Base2:
    def print2(self):
        print("我是base2...")

        
>>> class Base(Base1,Base2):
    pass

>>> b = Base()

>>> b.print1()
我是base1...
>>> b.print2()
我是base2...

一般情况下,为保证程序不易混乱,不要使用过多的“多继承”。

今天就到这了!!!


★finished by songpl,2019.1.6

继续

 

测试题:https://fishc.com.cn/thread-48765-1-2.html

0. 继承机制给程序员带来的最明显的好处是什么?

答:可以偷懒。

如果一个类A继承自另一个类B,这样A称为B的子类,把B称为A的父类、基类。继承可以使得子类具有父类的各种属性和方法。而不需要再次编写相同的代码。

在子类继承父类的同时,也可以重新定义一些属性,重写某些方法,这样会自动覆盖父类的属性和方法。

当然,可以在子类中新添加属性和方法。

1.  按照下面的方法重写__inti__,即如果会怎样?

class MyClass:
        def __init__(self):
                return "hellow"

答:

会报错,因为__init__()特殊方法不应返回除了None以外的任何对象。只能初始化定义。

2. 当子类定义了与父类相同名字的属性或者方法时,Python是否会自动删除父类的属性或方法?

答:不会删除。Python只是将父类的属性或者方法覆盖了,子类对象调用的时候会调用到新的属性和方法,但是父类仍然存在,只是子类队形“看不到”而已。

3. 假设已经定义鸟类,现在我们要定义企鹅继承与鸟类,但我们都知道企鹅是不会飞的,我们应该如何屏蔽父类(鸟类)中飞的方法?

答:覆盖父类中的方法,可以在子类中的函数中写pass,这样就能屏蔽。

如下:

class Bird:
    def fly(self):
        print("flying....")

class Penguin(Bird):
    def fly(self):
        pass

>>> B = Bird()
>>> B.fly()
flying....

>>> p = Penguin()
>>> p.fly() 

4. "super"函数有什么“超级”的地方?

答:super函数超级之处在于你不需要明确给我任何基类(父类)的名字,它会自动找出所有基类以及对应的方法。由于你不用给出基类的名字,这就意味着,你如果需要改变了类继承关系,你只需要改变class语句中的父类即可,而不必在代码中修改所有被继承的方法。(不是很懂)


★finished by songpl,2019.1.8

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值