继承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
17 3.如何使用继承?
18     语法:
19     class 类名称(父类的名称):
20
21     ps:在Python中一个子类可以继承多个父类
22     查找继承顺序使用mro()列表
23     print(类名称.mro())
24 """
25 # 继承语法
26 class Person:  # 父类
27     decs = ‘基类‘
28     def say_hi(self):
29         print(‘fdj;kll;;jlkkl;‘)
30 class Teacher(Person):  # 子类
31     pass
32 p = Teacher()
33 # 1.继承属性
34 print(p.decs)  # 基类
35 # 2.继承方法
36 print(p.say_hi())
37 # fdj;kll;;jlkkl;
38 # None
39 p.say_hi()  # fdj;kll;;jlkkl;

继承

1.2抽象

 1 ‘‘‘‘‘‘
 2 """
 3 继承与抽象
 4     抽象:不具体不清晰,看不懂,一种概念
 5     继承的正确打开方式:
 6     方式一:
 7     先抽象(形成一个具有公共属性的类),
 8     再继承(继承抽象形成的类).
 9     方式二:
10     继承一个现存的类,新添加新的功能
11 """
12 # 案例1
13 # 抽象
14 # 抽取老师和学生中相同的属性,形成的类
15 class Person:
16     def __init__(self,name,age,gender):
17         self.name = name
18         self.age = age
19         self.gender = gender
20     def say_hi(self):
21         print("name:%s,age:%s,gender:%s"%(self.name,self.age,self.gender))
22 class Teacher(Person):
23     # def __init__(self,name,age,gender):
24     #     self.name = name
25     #     self.age = age
26     #     self.gender = gender
27     # def say_hi(self):
28     #     print("name:%s,age:%s,gender:%s"%(self.name,self.age,self.gender))
29     pass
30 class Student(Person):
31     def __init__(self,name,age,gender,number):
32         super().__init__(name,age,gender)
33         self.number = number
34     def say_hi(self):
35         super().say_hi()
36         print("number:%s"%(self.number))
37
38 s = Student(‘llx‘,‘28‘,‘198‘,‘10‘)
39 s.say_hi()
40 """
41 name:llx,age:28,gender:198
42 number:10
43 """
44 # 案例2
45 class Teacher1:
46     def __init__(self,name,age,gender):
47         self.name = name
48         self.age = age
49         self.gender = gender
50     def say_hi(self):
51         print("name:%s,age:%s,gender:%s"%(self.name,self.age,self.gender))
52 class Student1(Teacher1):
53     def __init__(self,name,age,gender,number):
54         super().__init__(name,age,gender)
55         self.number = number
56     def say_hi(self):
57         super().say_hi()
58         print("number:%s"%(self.number))
59
60 s = Student1(‘wyf‘,‘28‘,‘198‘,‘20‘)
61 s.say_hi()
62 ‘‘‘
63 name:wyf,age:28,gender:198
64 number:20
65 ‘‘‘

抽象

1.3组合

 1 ‘‘‘‘‘‘
 2 """
 3 组合:(把类作为属性,传给另一个类)
 4     也是一种关系,
 5     表示两个对象之间是什么有什么的关系
 6
 7     例如:学生有手机,游戏角色有装备
 8
 9     将一个对象作为另一个对象的属性,
10     即:什么有什么
11
12     组合的目的:
13     降低耦合度
14     为了重用现有代码
15     (关联起来,使用其中的方法)
16
17
18 """
19 # 案例
20 class Phone:
21     def __init__(self,price,app,music):
22         self.price = price
23         self.app = app
24         self.music = music
25     def tall_phone(self):
26         print(‘price:%s,app:%s,music:%s‘%(self.price,self.app,self.music))
27 class Student:
28     # ps:把Phone类作为属性传给Student
29     def __init__(self,name,age,phone):
30         self.name = name
31         self.age = age
32         self.phone = phone
33     def study(self):
34         print(‘name%s:,age:%s,phone:%s‘%(self.name,self.age,(self.phone.price,self.phone.app,self.phone.music)))
35 p = Phone(‘1998‘,‘qq音乐‘,‘风灯‘)
36 s = Student(‘llx‘,‘24‘,p)
37 print(s.phone.price)  # 1998
38 s.phone.tall_phone()  # price:1998,app:qq音乐,music:风灯
39 s.study()  # namellx:,age:24,phone:(‘1998‘, ‘qq音乐‘, ‘风灯‘)

组合

ps:继承与组合对比

1 ‘‘‘‘‘‘
2 """
3 1.什么时候使用继承:分析两个类的关系,到底是不是:什么是什么的关系
4
5
6 2.什么时候使用组合:如果两个类之间 没有太大的关系,完全不属于同类
7
8 另外组合相比继承,耦合度更低了
9 """

ps:继承与组合对比

1.4菱形继承--了解

 1 ‘‘‘‘‘‘
 2 """
 3 菱形继承--了解
 4     Python支持多继承
 5     定义:
 6     当一个了有多个父类,多个父类有共同基类,称为菱形继承
 7 """
 8 class E:
 9     a = ‘m‘
10     b = ‘n‘
11     c = ‘o‘
12     d = ‘p‘
13     e = ‘e‘
14 class B(E):
15     a = ‘g‘
16     b = ‘b‘
17 class C(E):
18     a = ‘h‘
19     b = ‘i‘
20     c = ‘c‘
21 class D(E):
22     a = ‘j‘
23     b = ‘k‘
24     c = ‘l‘
25     d = ‘d‘
26
27 class A(B,C,D):
28     a = ‘a‘
29 q = A()
30 # 先深度,进入父类,多个父类,按广度找,最后在按深度
31 print(q.e) # e
32 print(q.d) # d
33 print(q.c) # c
34 print(q.b) # b
35 print(q.a) # a
36
37 # 多继承查找顺序mro()列表 -- 先深度,遇到共同父类,在广度
38 # ps :当出现了菱形继承时,新式类,先深度,当遇到了共同父类时就广度
39 # 新式类,就是深度优先
40 A.mro()
41 print(A.mro())  # [<class ‘__main__.A‘>, <class ‘__main__.B‘>, <class ‘__main__.C‘>, <class ‘__main__.D‘>, <class ‘__main__.E‘>, <class ‘object‘>]

菱形继承

2.属性的内容

2.1属性的查找顺序
ps:mro()列表查找访问顺序
语法:print(类名称.mro())

 1 ‘‘‘‘‘‘
 2 """
 3 1.属性的查找顺序
 4     先找对象自己 --- > 自己的类 --- > 父类 --- > 父类的父类 --- > 基类(object)
 5 2.方法
 6 mro()列表,查询属性的查找顺序
 7 """
 8 # 案例
 9 class A:
10     text = ‘嘿嘿‘
11     txt = ‘数据库‘
12     py = ‘运行员‘
13     xml = ‘前端‘
14 class B(A):
15     text = ‘哈哈‘
16     txt = ‘文件夹‘
17     py = ‘运行‘
18 class C(B):
19     text = ‘娃哈哈‘
20     txt = ‘文件‘
21 # 对象
22 p = C()
23 p.text = ‘嘻嘻嘻嘻‘
24 # 1.先找对象自己
25 print(p.text)  # 嘻嘻嘻嘻
26 # 2.再找自己类
27 print(p.txt)  # 文件
28 # 3.再找父类
29 print(p.py)  # 运行
30 # 4.自找父类的父类
31 print(p.xml)  # 前端
32 # 5.自找基类
33 p.__init__()
34 print(p.__init__() )  # None
35
36 # 使用方法
37 print(C.mro())  # [<class ‘__main__.C‘>, <class ‘__main__.B‘>, <class ‘__main__.A‘>, <class ‘object‘>]

属性的查找顺序

2.2派生

 1 ‘‘‘‘‘‘
 2 """
 3 派生:
 4     属性在子类中存在
 5     父类中完全没有的属性,称为派生
 6
 7     通常子类都会新增一些功能属性,不可能和父类完全一样,都可以称为派生,
 8     即派生指的就是子类
 9 """
10 # 案例
11 class A:
12     text = ‘嘿嘿‘
13     txt = ‘数据库‘
14     py = ‘运行员‘
15     xml = ‘前端‘
16     def g(self):
17         print(‘哈哈‘)
18 class B(A):
19     text = ‘哈哈‘
20     txt = ‘文件夹‘
21     py = ‘运行‘
22     def h(self):
23         print(‘heihei‘)
24 class C(B):
25     text = ‘娃哈哈‘
26     txt = ‘文件‘
27     css = ‘jq‘
28     def f(self):
29         print(‘嘿嘿‘)
30 # 对象
31 p = C()
32 # 1.类覆盖
33 p.text = ‘嘻嘻嘻嘻‘
34 # 1.覆盖
35 print(p.text)  # 嘻嘻嘻嘻
36 # 2.覆盖
37 print(p.txt)  # 文件
38 # 3.覆盖
39 print(p.py)  # 运行
40 # 类派生
41 # 1.派生
42 print(p.xml)  # 前端 # 与基类做对比
43 # 2.派生
44 print(p.css)  # jq
45
46 # 对象派生
47 p.f()  # 嘿嘿
48 p.h()  # heihei
49 p.g()  # 哈哈

派生

2.3覆盖

 1 ‘‘‘‘‘‘
 2 """
 3 覆盖:也称之为重写overrides(覆盖)
 4     当子类中出现与父类中完全一致的属性或方法,
 5     由于属性的查找顺序,
 6     所以父类的同名属性被覆盖
 7 """
 8 class A:
 9     text = ‘嘿嘿‘
10     txt = ‘数据库‘
11     py = ‘运行员‘
12     xml = ‘前端‘
13     def f(self):
14         print(111111)
15 class B(A):
16     text = ‘哈哈‘
17     txt = ‘文件夹‘
18     py = ‘运行‘
19     def f(self):
20         print(2222)
21 class C(B):
22     text = ‘娃哈哈‘
23     txt = ‘文件‘
24     def f(self):
25         print(3333)
26 # 对象
27 p = C()
28 p.text = ‘嘻嘻嘻嘻‘
29 # 类属性
30 # 1.覆盖
31 print(p.text)  # 嘻嘻嘻嘻
32 # 2.覆盖
33 print(p.txt)  # 文件
34 # 3.覆盖
35 print(p.py)  # 运行
36 # 4.派生
37 print(p.xml)  # 前端
38
39 # 对象属性
40 p.f()  # 3333

覆盖

3.子类访问父类的内容

3.1子类访问父类,三种方法

 1 ‘‘‘‘‘‘
 2 """
 3 子类访问父类的方法:三种方法
 4     1.方法一(python2)
 5     语法:
 6     super(当前类名称,self).名字(你要调的父类属性或方法)
 7     2.方法二(python3)
 8     语法:
 9     super().名字(你要调的父类属性或方法)
10     3.方法三(直接指定类名称(你要调的父类属性或方法(self)),调用)
11     指名道姓调用
12     ps:指名道姓调用和继承无关
13
14 """

子类访问父类的方法--3种

3.2自定义list--MyList

 1 ‘‘‘‘‘‘
 2 # 案例
 3 ‘‘‘
 4 结论:
 5     当你继承一个你现有的类,
 6     并且覆盖了父类的__init__(初始化,创建对象的时候触发)方法时,
 7
 8     必须在初始化方法的‘第一行‘调用父类的初始化方法,并传入父类所需参数
 9 ‘‘‘
10 ‘‘‘
11 继承内置list,定义我自己的mylist
12 ‘‘‘
13 class MyList(list):
14     def __init__(self,element_type):
15         # 调用父类的初始化方法,来完成基本的初始化
16         super().__init__()
17         self.element_type = element_type
18     def append(self, object):
19         """
20
21         :param object: 是要存储的元素
22         :return:没有/None
23         """
24         if type(object) == self.element_type:
25             # 我们需要在这里访问父类的append函数来完成真正的存储操作
26             super(MyList,self).append(object)
27         else:
28             print("sorry sir ,your element type not is %s"%self.element_type)
29
30 # 创建指定要存储的元素类型
31 # m = MyList(int)
32 # # 当你有需求时,需要在创建对象时,干点什么事,我就该想到初始化方法
33 # m.append(1)
34 # print(m[0])  # 1
35 # print(m.__dict__)
36 # print(m) # [1]
37 m1 = MyList(str)
38 m1.append(‘dgggdg‘)
39 print(m1)  # [‘dgggdg‘]
40 m2 = MyList(dict)
41 m2.append({1:‘d‘})
42 print(m2) # [{1: ‘d‘}]

Mylist

3.3坑点 ___init__

 1 ‘‘‘‘‘‘
 2 """
 3 坑点:
 4 结论:
 5 当你继承一个现有的类,并且你要覆盖父类__init__的方法,必须,先调用下父类的__init__,赋予初始值
 6
 7 """
 8 class Person:
 9     def __init__(self,name,gender,age):
10         self.name = name
11         self.gender = gender
12         self.age = age
13     def say_hi(self):
14         print("name:%s,gender:%s,age:%s"%(self.name,self.gender,self.age))
15
16 class Student(Person):
17     def __init__(self,name,gender,age,number):
18         super().__init__(name,gender,age)
19         self.number = number
20     def say_hi(self):
21         super().say_hi()
22         print("number:%s"%(self.number))
23 s = Student(‘llx‘,‘98‘,‘24‘,‘10‘)
24 print(s.__dict__)  # {‘name‘: ‘llx‘, ‘gender‘: ‘98‘, ‘age‘: ‘24‘, ‘number‘: ‘10‘}
25 s.say_hi()
26 # name:llx,gender:98,age:24
27 # number:10

坑点--__init__

4.新式类与经典类 -- 补充

4.1新式类

1 ‘‘‘‘‘‘
2 """
3 新式类:Python3中都是新式类
4 新式类:任何显式或隐式中继承自object,都是新式类
5 """

新式类

4.2经典类

1 ‘‘‘‘‘‘
2 """
3 经典类:即,不是object子类,仅在Python2中出现
4 """

经典类

原文地址:https://www.cnblogs.com/llx--20190411/p/11247468.html

时间: 2024-08-29 13:15:10

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

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

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

第十一章、对象属性查找顺序与属性和方法

目录 第十一章.对象属性查找顺序与属性和方法 一.属性查找 二.对象赋属性 三.绑定方法 第十一章.对象属性查找顺序与属性和方法 一.属性查找 对象自身-->子类-->父类(多继承)-->报错 二.对象赋属性 方式一:给自己对象加一个属性 student=Student() student.name='nick' 方拾二:__init__()方法内赋值 方式三:对象.方法 change_name(self,name) self.name='nick' 三.绑定方法 定义在类内部的方法 类

【python】-- 类的多继承、经典类、新式类

继承知识点补充 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类. 一.多继承 之前我们都是讲的单继承,那么什么是多继承呢?说白了,就是:子类可以继承多个父类,就叫多继承. class SchoolMember(object): #SchoolMember类 '''学校成员基类''' def tell(self): print("the schoolmeber is tell...") class School(ob

绑定与非绑定方法 继承 继承与抽象 查找属性关系 派生与覆盖 访问父类的内容

类属性与对象属性 类中应该仅存储所有对象共有的内容 如所有人的国籍相同那就放到类中 对象中存储每个对象独有的内容 ? 如每个人的名字都不同 初始化函数class Person: color = 'white' def read(self): print('hamlet') # 创建对象 也称之为实例化 产生的对象也称之为实例a1=Person()print(a1)print(a1.color)print(a1.__dict__) a2 = Person()print(a2)print(a2.re

oop 中的属性查找顺序,派生 覆盖

属性的查找顺序 先找自己的,自己没有找他爸的 这个(他爸 就是父类,自己 就是子类) 派生就是子类的代码 和父类的 代码 不一样时 这就叫做派生子类继承了 父类的 代码 还添加了 自己的新代码 即通常就是派生类而 派生就指的时子类 覆盖 就是 子类中的属性或者方法 和父类 出现的一样 这就叫覆盖 class A: text = "haha" class B(A): text = "heihei" pass b = B()print(b.text)这样你调用 只能调用

python3 面向对象、类、继承、组合、派生、接口、子类重用父类方法

对象是特征(变量)与技能(函数)的结合体而类是一系列对象共同的特征与技能的集合体 class teacher: lesson = "python" def __init__(self,name,color,age): # 只干初始化的活 self.name = name if not isinstance(name,str): raise TypeError self.color = color self.age = age def jineng(self): print('新技能')

python 属性描述符及属性查找顺序

1 import numbers 2 class IntField: # 当一个类实现了 __get__, __set__, __delete__ 3 """ 4 数据描述符 5 """ 6 def __get__(self, instance, owner): 7 return self.value 8 def __set__(self, instance, value): 9 if not isinstance(value, numbers.

Python全栈--9.1--面向对象进阶-super 类对象成员--类属性- 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 注意点: self ,我们讲过了,self = 对象,实例化后的对象调用类的各种成员的时候的self就是这个对象. 而且我们也讲过了

继承、派生、新式类与经典类

目录 继承 1.什么是继承? 2.为什么要继承? 3.如何实现继承? 寻找继承关系 继承背景下对象属性的查找顺序 派生 什么是派生? 子类派生出新的属性,并重用父类的属性 新式类与经典类 钻石继承(菱形继承) 通过继承实现修改json模块数据类型 继承 Downwards is the only way forwards .--<盗梦空间> 面向对象阶段最重要的知识点:继承.封装.多态 1.什么是继承? 指新建类的方法,新建的类称之为子类或者派生类,子类继承的类叫做父类,也称之为基类或者超类.