标签:
继承
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())
标签:
原文地址:http://www.cnblogs.com/wangjiaxing/p/4886673.html