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())

posted @ 2015-10-16 23:30  淡蓝色的天空很美  阅读(282)  评论(0编辑  收藏  举报