038类和对象:继承
继承
1.继承简单使用:
格式:class DerivefClassName(BaseClassName):
BaseClassName:为基类、父类或超类
DerriverfClassName:为子类
如:>>> class Parent: #父类
... def hello(self):
... print("father")
...
>>> class Child(Parent): #子类
... pass
...
>>> p = Parent()
>>> p.hello()
father
>>> c = Child() #子类继承了父类的方法
>>> c.hello()
father
2.如果子类中定义与父类同名的方法和属性,则会自动覆盖父类对应的方法或属性
如:还是上面那个例子,修改子类的方法
>>> class Child(Parent): #给子类定义一个与父类同名的方法
... def hello(self):
... print("child")
...
>>> c = Child()
>>> c.hello() #子类中覆盖了父类的方法
child
3.问题:子类定义了一个与父类同名的方法,但是子类也想使用父类的方法怎么办呢?
在自动覆盖前调用父类的方法即可,方法有两种,如下:
方法1:父类名称.方法名称(self),这里的self是子类的
如:Fish.__init__(self)
但是这个方法不是特别好
方法2:super().方法名称()
super函数超级在于,不需要给父类的名字,它会自动找出所有父类以及对应的方法。
如:super().__init__()
例: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 Shark(Fish):
def __init__(self):
super().__init__()
#Fish.__init__(self)
self.hungry = True
def eat(self):
if self.hungry:
print("吃货的梦想就是天天有的吃^_^")
self.hungry = False
else:
print("太撑了,吃不下了!")
4.问题:如何屏蔽父类方法呢?
方法:很简单,用pass即可
如:>>> class Bird:
... def fly(self):
... print("Fly away")
...
>>> class Penguin(Bird):
... def fly(self):
... pass
...
>>> bird = Bird()
>>> penguin = Penguin()
>>> brid.fly()
Fly away
>>> penguin.fly()
5.多重继承: 就是可以继承多个父类的属性和方法
能不用就不用,使用不当会导致重复调用(钻石继承、菱形继承)
格式:class DerivefClassName(Base1,Base2...):
如:>>> class Base1: #父类1号
... def foo1(self):
... print("foo1")
...
>>> class Base2: #父类2号
... def foo2(self):
... print("foo2")
...
>>> class C(Base1,Base2): #子类
... pass
...
>>> c = C()
>>> c.foo1() #继承父类1号
foo1
>>> c.foo2() #继承父类2号
foo2
练习:
1.定义一个点(Point)类和直线类(Line)类,使用getLen方法获得直线的长度
1 #!/usr/bin/python
2 #coding:utf8
3
4 import math
5
6 class Point:
7 def __init__(self,x=0,y=0):
8 self.x = x
9 self.y = y
10
11 def getX(self):
12 return self.x
13
14 def getY(self):
15 return self.y
16
17 class Line:
18 def __init__(self,p1,p2):
19 self.x = p1.getX() - p2.getX()
20 self.y = p1.getY() - p2.getY()
21 self.len = math.sqrt(self.x*self.x + self.y*self.y)
22
23 def getLen(self):
24 return self.len
25
26 p1 = Point(1,1)
27 p2 = Point(4,5)
28 line = Line(p1,p2)
29 print(line.getLen())