面向对象-继承,顺序查找,派生,子类访问父类,菱形继承

OOP的三大特征(优势)    1.封装    2.继承    3.多态

继承:是两个对象之间产生的一种关系    a继承b     在OOP的程序中继承是描述类与类之间的一种关系继承的好处:程序中 一个类a继承另一个类b a就可以使用B的属性和方法具体的说:继承极大的提高了代码的重用性继承描述的是 什么 是什么的关系 注意:在使用集成时,要自己分析.类与类之间的关系 不应该违反显示生活中的原则在使用继承的时候一定是先抽象 在继承抽象:抽取一堆类共同拥有的内容 形成一个新的抽象的概念(也称为公共基类) 这个过程就叫做 抽象注意:很多情况下 抽象得到的新的类型与业务是不相关的 仅仅是因为代码需要

# class OldBoyPerson:
#     school=‘oldboy‘
#     def __init__(self,name,gender,age):
#         self.name=name
#         self.gender=gender
#         self.age=age
#
#     def say_hi(self):
#         print(‘hello my name is %s‘%self.name)
#
# class Teacher(OldBoyPerson):
#     def teaching(self):
#         print(‘%s is teaching‘%self.name)
#
# class Student(OldBoyPerson):
#     def studying(self):
#         print(‘%s is studying‘%self.name)
#
# t1=Teacher(‘xxx‘,‘man‘,17)
# t1.teaching()
# t1.say_hi()
#
# stu1=Student(‘xxx‘,‘man‘,17)
# stu1.studying()
# stu1.say_hi()


没有继承关系的时候    对象->类中存在继承关系后 : 对象-> 自身的类中->父类 父类的父类....objectobject 是所有类的根类  所有类都直接或间接的继承自object在定义类的时候 如果你没有手动继承任何类 默认继承objectobject 中包含了所有对象通用的方法

新式类 只要是继承自object 都是新式类 在python3中所有类都是新式类python2中不会自动继承object 需要手动继承object 才能变成一个新式类新式类和经典类的区别在于继承关系中的属性的查找顺序不同

可以继承一个系统已有的类 来扩展新功能需求:给list扩展类型限制的功能  只允许存储整型数据
# class MyList(list):
#     def append(self,object):
#         print(‘append run‘)
#         if type(object)==int:
#             list.append(self,object)
#         else:
#             print(‘必须是元素!‘)
# li=MyList()
# li.append(100)
# li.append(‘abc‘)
# print(li)
派生    当一个类继承另一个类 并存在与父类不同的内容时 就称之为派生类    通常情况下 一个子类就是一个派生类覆盖    在继承关系中 子类可以出现与父类完全相同的方法 根据查找顺序 会优先使用子类中的方法 这种情况称之为覆盖

很多情况下我们需要在子类中来访问父类中的内容 就可以通过super().要访问的名字

# class Person:
#     test=‘12345‘
#     def __init__(self,name,sex,age):
#         self.name = name
#         self.sex=sex
#         self.age=age
#     def say_hi(self):
#         print(self.name,self.sex,self.age)
#
#
# class Student(Person):
#     def __init__(self,name,sex,age,number):
#         # self.name = name
#         # self.sex = sex
#         # self.age = age
#         # Person.__init__(self,name,sex,age)
#         # super(Student, self).__init__(name,sex,age)
#         super().__init__(name,sex,age)
#         self.number=number
#
#
#     def say_hi(self):
#         super().say_hi()
#         print(self.number)
#         print(super().test)
#
# stu1=Student(‘xxx‘,‘man‘,100,‘9527‘)
# stu1.say_hi()

覆盖

组合:即把不同的对象组合到一起 也是用来减少重复代码一个对象可以把另一个对象作为属性来使用
class PC:
    def __init__(self,pc_type):
        self.pc_type=pc_type

    def working(self):
        print(‘%s 计算机正在计算‘%self.pc_type)

class Student():
    def __init__(self,name,pc):
        self.name=name
        self.pc=pc

    def studying(self):
        self.pc.working()
        print(‘%s 使用%s 电脑在听课‘%(self.name,self.pc.pc_type))
pc1=PC(‘联想‘)
stu1=Student(‘张三丰‘,pc1)
stu1.studying()
python支持多继承一个类可以同时继承多个其他类好处:可以同时拥有多个类中已存在的内容坏处:如果父类中出现了重复的名字  执行顺序需要参考mro列表 查看mro列表 类名.mro()默认情况下 是按照继承顺序来访问属性

经典类和新式类 在访问顺序上有所不同经典类 按照深度优先的顺序新式类 也按照深度优先 遇到公共父类 则找另一条继承关系 最后才找公共父类

菱形继承说的是一个类有多个父类 并且多个父类之间有公共父类

原文地址:https://www.cnblogs.com/gengbinjia/p/10400995.html

时间: 2024-11-29 06:30:44

面向对象-继承,顺序查找,派生,子类访问父类,菱形继承的相关文章

继承1.继承,2.属性查找顺序3.子类访问父类内容4.补充,经典类与新式类 --------- # 21

继承: 1.继承 1.1继承 1 '''''' 2 """ 3 1.什么是继承? 4 继承是描述两个对象之间,什么是什么的关系 5 6 案例:麦兜,佩奇,猪刚鬓 -- 都是猪 7 8 在程序中,继承描述的是类和类之间的关系 9 10 例如:a 继承 b,a就能直接使用b已经存在的方法或属性 11 此时,a称之为子类,b被称之为父类,也称为基类 12 13 2.为什么要使用继承? 14 继承的一方制剂使用另一方已经有的东西 15 其目的是:提高重用性(重用已有的代码) 16 1

python基础之继承实现原理、子类调用父类的方法、封装

继承实现原理 python中的类可以同时继承多个父类,继承的顺序有两种:深度优先和广度优先. 一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找 示例解析: 没有共同头部父类的类型 1 class E: 2 def test(self): 3 print('from E') 4 # pass 5 class F: 6 def test(self): 7 print('from F') 8 # pass 9 10 class C: 11 def test(se

Java子类访问父类的私有成员变量

/**子类会继承父类所有的属性和方法. * 但是根据不同的权限标识符,子类不可见父类的私有变量,但可以通过父类的公共方法访问私有变量 * 所以对于重名变量,子类和父类都各有一份. * 对于子类和父类中重名的方法,则为重写.即子类重写了父类的方法,用于多态. * 同一个类中函数的签名不同,则为方法的重载.函数的签名为函数名+参数列表,与返回值无关. */

c/c++ 继承与多态 由子类向父类的转换规则

问题1:子类B可以有3种方式(public, protected, private)继承父类A,用哪种方式继承,用户代码才能把子类B的对象转换成父类A的对象呢? 只用当子类B以public方式继承父类A后,在用户代码里,才能把子类B的对象转换成父类A的对象. 原因如下: 下面例子的类Pro_derv和类Pri_derv,分别是以protected和 private的方式继承了Base,所以在类Pro_derv和类Pri_derv对象里,原来在Base类里的成员pub_mem()已经不是publi

子类继承父类时,子类与父类有同名变量,当使用子类对象调用父类方法使用同名变量,这个变量是子类的,还是父类的? (改)

1 public class Test4 { 2 public static void main(String[] args){ 3 Son son = new Son(); 4 son.minusOne(); 5 System.out.println(son.testValue); 6 System.out.println(son.getSuperTestValue()); 7 son.plusOne(); 8 System.out.println(son.testValue); 9 Syst

子类如何访问父类

子类只能访问父类的非私有属性及方法 1.子类访问父类非私有成员变量 (1)访问不重名成员变量 在主类中:子类对象.父类变量 在子类中:super.父类变量 (2)访问重名成员变量 在主类中:父类 对象 = new 子类() 对象.父类变量 在子类中:super.父类变量 2.子类访问父类非私有成员方法 (1)访问不重名成员方法 在主类中:子类对象.父类方法 在子类中:super.父类方法 或直接调用父类方法 (2)访问重名成员方法 在子类中:super.父类方法 原文地址:https://www

三种继承方式和三种访问权限

 也就是说子类只能访问父类的保护和公有成员,而对象只能访问公有成员. 继承方式 1. 三种继承方式不影响子类对父类的访问权限,子类对父类只看父类的访问控制权.     2. 继承方式是为了控制子类(也称派生类)的调用方(也叫用户)对父类(也称基类)的访问权限. 3. public.protected.private三种继承方式,相当于把父类的public访问权限在子类中变成了对应的权限. 如protected继承,把父类中的public成员在本类中变成了protected的访问控制权限:priv

java子类与父类的关系

摘自翁恺老师的mooc 对理解继承来说,最重要的事情是,知道哪些东西被继承了,或者说,子类从父类那里得到了什么.答案是:所有的东西,所有的父类的成员,包括变量和方法,都成为了子类的成员,除了构造方法.构造方法是父类所独有的,因为它们的名字就是类的名字,所以父类的构造方法在子类中不存在.除此之外,子类继承得到了父类所有的成员. 但是得到不等于可以随便使用.每个成员有不同的访问属性,子类继承得到了父类所有的成员,但是不同的访问属性使得子类在使用这些成员时有所不同:有些父类的成员直接成为子类的对外的界

C++继承详解之三——菱形继承+虚继承内存对象模型详解vbptr(1)

在我个人学习继承的过程中,在网上查阅了许多资料,这些资料中有关菱形继承的知识都是加了虚函数的,也就是涉及了多态的问题,而我在那个时候并没有学习到多态这一块,所以看很多资料都是云里雾里的,那么这篇文章我想以我自己学习过程中的经验,由简到较难的先分析以下菱形继承,让初学者先对这个问题有一点概念,在后面会由浅入深的继续剖析. 本篇文章不会涉及到多态也就是虚函数的菱形继承,在后面的文章更新中,我会慢慢把这些内容都加进去. 菱形继承(也叫钻石继承)是下面的这种情况: 对应代码如下: #include <i