14 python类的继承

  1 ---------------1 类的继承  ---------------------
  2 
  3 class Site(object):  ## 继承OBJECT基类
  4     """docstring for ."""
  5     def __init__(self, name,address,course):
  6         self.name=name
  7         self.address=address
  8         self.course=course
  9     def about(self):
 10         print (self.name,self.address,self.course)
 11 
 12 
 13 class XXKT(Site): ##继承Site类
 14     """docstring for XXKT."""
 15     def __init__(self):
 16         super(XXKT,self).__init__('jim','www.baidu.com','100')  ## 构造时,调用父类的构造方法
 17         Site.__init__('jim','www.baidu.com','100')  ## 此法也是可以的
 18         print "xxxx"  ## 或者是直接覆盖掉父类的构造方法
 19 
 20 a=XXKT()  ## 实例化
 21 a.about() ## 访问父类的实例方法
 22 print (a.name)  ## 访问父类的实例属性
 23 print (a.address)  ## 访问父类的实例属性
 24 print (a.course)   ## 访问父类的实例属性
 25 
 26 
 27 ---------------1 类的多重继承  ---------------------
 28 class Bird(object):  ## 鸟
 29     def fly(self):
 30         print "fly ....."
 31 
 32 class Fish(object):  ## 鱼
 33     def swim(self):
 34         print "swim ...."
 35 
 36 
 37 class FishFLY(Bird,Fish):  ## 多重继承,飞鱼
 38     pass
 39 
 40 a=FishFLY()
 41 a.fly()
 42 a.swim()
 43 
 44 
 45 --------------3, 类的方法的覆盖--------------------------------------
 46 覆盖:
 47     即子类的方法和父类的方法重名,
 48     则调用这个方法时,则只会调用子类的方法,
 49     当然也可以强制访问父类的方法(需要用到super(),显示调用)
 50 
 51 ----------方法的覆盖 之 构造方法--------------------
 52 class ClassName(object):
 53     def __init__(self, arg):
 54         print(arg)
 55 
 56 class Classname2(ClassName):
 57     def __init__(self):   ## 如果父类构造函数有参数,
 58         print ("xxx")     ## 则如果子类不重写构造函数,则子类实例化时会调用父类的,则子类实例化时必段也要有参数,
 59                           ## 如果子类重写了构造函数,则会覆盖掉父类的构造函数,父类构造函数则不会被执行,除非显示的使用super.
 60         super(Classname2,self).__init__('ddd')  ##python2的写法
 61         super().__init__('dddd')  ##python3的写法
 62 
 63 
 64 p2=Classname2()
 65 
 66 ------------------------
 67 Python子类调用父类内属性的方法
 68 
 69 最常见的就是初始化方法__init__()
 70 
 71 python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,
 72 如果子类不实现这个函数,初始化时调用父类的初始化函数,
 73 如果子类实现这个函数,就覆盖了父类的这个函数,
 74 既然继承父类,就要在这个函数里显式调用一下父类的__init__(),
 75 ##!!!!!这跟C++,jAVA不一样,他们是自动调用父类初始化函数的。
 76 
 77 调用父类函数有以下方法:
 78 
 79 # -*- coding:utf-8 -*-
 80 class Animal():
 81     def __init__(self, name):
 82         self.name = name
 83  
 84     def saySomething(self):
 85         print("I am " + self.name)
 86  
 87 class Dog(Animal):
 88     def __init__(self, name):
 89         super().__init__(name)
 90  
 91     def saySomething(self):
 92         print ("I am "+ self.name + ", and I can bark")
 93   
 94 
 95  
 96 
 97 1.直接写类名调用: parent_class.parent_attribute(self)
 98 
 99 2.用 super(type, obj).method(arg)方法调用:super(child_class, child_object).parent_attribute(arg)   【不需要写self】
100 
101 3.在类定义中调用本类的父类方法,可以直接 super().parent_method(arg)  【个人推崇这种写法】
102 
103 样例如下:
104 
105 # -*- coding:utf-8 -*-
106 # file_name: python_class_inheritance_example.py
107 class Animal():
108     def __init__(self, name):
109         self.name = name
110  
111     def saySomething(self):
112         print("I am " + self.name)
113  
114 class Dog(Animal):
115     def __init__(self, name):
116         super().__init__(name)
117  
118     def saySomething(self):
119         print ("I am "+ self.name + ", and I can bark")
120  
121     def animal_say_1(self):
122         # 子类调用父类的方法
123         #  方式1
124         super(Dog, self).saySomething()
125  
126     def animal_say_2(self):
127         #  方式2 [推荐]
128         super().saySomething()
129      
130     def animal_say_3(self):
131         # 方式3
132         Animal.saySomething(self)
133  
134  
135 if __name__ == "__main__":
136     dog = Dog("Blake")
137     dog.saySomething()
138     dog.animal_say_1()
139     dog.animal_say_2()
140     dog.animal_say_3()
141     # 子类对象调用被覆盖的父类方法
142     super(Dog, dog).saySomething()
143  
144 '''
145 输出结果如下:
146 python python_class_inheritance_example.py
147 I am Blake, and I can bark
148 I am Blake
149 I am Blake
150 I am Blake
151 I am Blake
152 '''

 

posted @ 2018-07-02 15:48  虫儿要吃草  阅读(213)  评论(0编辑  收藏  举报