核心语法-Python–Class语法04
类的继承性
什么是继承?
作为面向对象编程语言的一个重要特点和主要能力,继承是指类可使用现有类(父类)的所有功能,并在无须修改父类的情况下对现有功能进行扩展。
通过继承创建的新类被称为“子类”或“派生类”,被继承的类被称为“基类”、“父类”或“超类"。继承的过程就是从一般到特殊的过程。
Python的一个子类可继承一个或多个基类。如果只继承一个基类,则被称为”单继承“;如果继承两个或多个基类,则被称为“多继承”;如果子类3继承子类2,而子类2又继承子类1,则被称为"多重继承",但是,一般情况下,一个子类通常只有一个基类,要实现多继承,可采用多极继承(多重继承)。在考虑使用继承时,有一点必须加以注意,即两个类之间应该是“属于”关系。例如,雇员类Employee是人,管理者类也是人,因此。这两个类均可继承Person类(人类)。但是腿类Leg却不能继承Person类,因为腿类与人类之间没有属于与被属于的关系。子类继承父类的属性和方法,子类可使用父类的所有属性和方法。
class 子类(父类1[,父类2]):
类体(定义属性和方法的语句块)
()内的父类可为一个或多个。如果是一个,则为单继承;如果是多个,则为多继承;如果省略,则父类默认为object,它是系统默认的所有类的基类。
类的单继承
单继承是指子类只继承一个父类。在单继承的情形下,子类只有一个基类。子类可继承和使用父类的所有属性和方法。
class Animal(object):
def __init__(self,name,sex,classtype):
self.name = name
self.sex = sex
self.classtype = classtype
def describe(self):
print("名称:{0}雌雄:{1}科类:{2}".format(self.name,self.sex,self.classtype))
#定义子类
class Bird(Animal):
def __init__(self,name,sex,classtype,flyable):
Animal.__init__(self,name,sex,classtype)
#构造函数的继承,以继承父类的属性和方法
self.flyable = flyable #子类的属性
if __name__ == '__main__':
b1 = Bird("maque","F",'BirdClass','fly')
print(b1.name)
b1.describe()
上述类。根据允许结果可分析到,子类并没有定义name属性和describe()方法,但是子类的实例b1可访问name属性、调用describe()方法,因为
它们是属于父类的。由此可见,子类的确继承了父类的属性和方法。
#案例:不继承父类构造函数的情形
#案例:不继承父类构造函数的情形
#定义父类
class Animal(object):
def __init__(self,name,sex,classtype):
self.name = name
self.sex = sex
self.classtype = classtype
def describe(self):
print("名:{0}性:{1}科:{2}".format(self.name,self.sex,self.classtype))
class Bird(Animal):
def __init__(self,name,sex,classtype,flyable):
self.flyable = flyable
if __name__ == '__main__':
b1 =Bird('maque','F','birdclass','fly')
print(b1.name)
b1.describe()
"""
Traceback (most recent call last):
File "D:/Python/pycharm/pycharm_code/Class_Python04.py", line 61, in <module>
print(b1.name)
AttributeError: 'Bird' object has no attribute 'name'
原因:Bird对象并无属性name,这是因为子类并没有继承父类的name属性,子类自身也无name属性。由此可得出结论:要使子类继承父类的属性和方法,必须在子类
的构造函数中显式地调用父类的构造函数,此过程被称为构造函数的继承。
"""
构造函数的继承
#1、继承构造函数的第一种方式
父类名称.init(self,参数1,参数2)
其中,括号内的第一个参数必须为self,余下的参数即父类的实例属性。例如:Animal.init(self,name,sex,classtype)
要注意,当以这种方式调用时,第一个参数self必须被显式传递,它不会被隐式传递,即必须为self,如果被省略,则将报错;其余参数则为父类的实例属性,直接复制
父类的实例属性即可。
此方式既可被用在单继承场合,也可被用在多继承场合。
#2、继承构造函数的第二种方式
super(子类,self).init(参数1,参数2)
其中,内置函数super(子类,self)用于表示子类的父类,它有两个参数----子类与self;而__init__(参数1,参数2)为构造函数,与第一种方式不同的是,它不需要self
参数,所有参数均为父类的实例属性。
#关于继承的一个重要特性
class Animal(object):
def __init__(self,name,sex,classtype):
self.name = name
self.sex = sex
self.classtype = classtype
def describe(self):
print("I am father!")
#定义子类
class Bird(Animal):
def __init__(self,flyable):
self.flyable = flyable
if __name__ == '__main__':
b1 = Bird('fly')
b1.describe()
#案例
class ScaleConverter(object):
def __init__(self,unit_from,unit_to,factor):
self.unit_from = unit_from
self.unit_to = unit_to
self.factor = factor
def description(self):
return "Convert" + self.unit_from + 'to' + self.unit_to
def convert(self,value):
return value*self.factor
class ScaleAndOffsetConverter(ScaleConverter):
def __init__(self,unit_from,unit_to,factor,offset):
ScaleConverter.__init__(self,unit_from,unit_to,factor)
self.offset = offset
def convert(self,value):
return value * self.factor+self.offset