码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象三大特性-继承

时间:2018-10-22 21:25:41      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:子类   ice   col   pre   调用   对象   self   多个   people   

一、什么是继承:

  继承就是一种新建类的一种方式。

二、为什么要用继承

  减少代码的冗余

通过代码来讲解
class
Student: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def choice_course(self): print(%s is choice coursing % self.name) class Teacher: def __init__(self, name, age, sex, tea_id): self.name = name self.age = age self.sex = sex self.tea_id = tea_id def set_score(self, student_obj): print(%s is set_score to %s % (self.name, student_obj.name))
‘‘‘
我这里定义了一个Teacher和Student类,这样写没用什么问题,但是上面有很多重复性的代码,怎么解决这个问题,就要用到继承特性分析一下,在init方法中有很多重复的代码,
这样我们再建一个类,这个类设置成他们的父类,在这个类中设置init方法
‘‘‘
class People:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex

class Student(People):
def __init__(self, name, age, sex):
People.__init__(self, name, age, sex) # 这种是一个类中,直接通过类名.属性,调用到另一个类的属性,这和继承没用关系
# super(Student,self).__init__(name,age,sex) #这种是通过super方法,访问到该类的父类的属性,这和继承有关

def choice_course(self):
print(‘%s is choice coursing‘ % self.name)


class Teacher(People):
def __init__(self, name, age, sex, tea_id):
super(Teacher, self).__init__(name, age, sex)
self.tea_id = tea_id

def set_score(self, student_obj):
print(‘%s is set_score to %s‘ % (self.name, student_obj.name)
### 有个知识点:调用父类属性的两种方式
# 1、通过类名.属性,,只是直接访问类的一个属性,记住这个继承是没用关系的
# 2、通过super方法,super.属性 可以访问到其父类的属性 这个是跟继承是有关系

 下面我讲一下,其实一个类他是可以同时继承多个父类的,那么就有一个问题了,那查找属性的顺序是怎么样的?
# 讲这个我先讲下 类分为新式类和经典类
# 新式类:凡是继承object类的类以及他的子类,这些都是新式类 在python3中,所有类都会默认继承object类,所以python3只有新式类
# 经典类:凡是没用继承object类的类及其子类,这些都是经典类 在python2中,既有新式类也有经典类

# 如果这个类只有一个父类,那么它的属性查找顺序是(用对象调属性)
# 该对象的名称空间、对象对应类的名称空间、该类的父类的名称空间,该类父类的父类的名称空间。。。。一直找到object
# 如果这个类有多个父类,那么他的属性查找顺序是(对象调属性)
# 下面举个例子
# class C(object):
# a = ‘c‘
#
# class B(object):
# a = ‘b‘
#
# class D(object):
# a = ‘d‘
#
# class F(B, C, D):
# pass
#
# print(F.a)
# print(F.__bases__)
# 那么F的查找顺序就是先B,C,D 你可以试试运行下,将各个类下的a属性注释掉,就可以验证出来
# 由于这是在python3中,这些类都是新式类,而新式类查找方法是广度优先:所以查找顺序是FB C Dobject 最后才是找object
# 那如果这些类是经典类的话,查找方式深度优先:所以顺序是FBobject C D

# 总结一点:新式类的查找方式:广度优先
# 经典类的查找方式:深度优先
 

 

面向对象三大特性-继承

标签:子类   ice   col   pre   调用   对象   self   多个   people   

原文地址:https://www.cnblogs.com/zhuchunyu/p/9833003.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!