继承的简单例子
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