Python编程中类与类的关系详解


Posted in Python onAugust 08, 2019

类与类的关系

依赖关系

# 依赖关系: 将一个类的类名或者对象传给另一个类的方法中.
class Elephant:
  def __init__(self, name):
    self.name = name
  def open(self,r1):
    # print(ref1)
    print(f'{self.name}默念三声: 芝麻开门')
    r1.open_door()
  def close(self):
    print('大象默念三声:芝麻关门')
class Refrigerator:
  def __init__(self, name):
    self.name = name
  def open_door(self):
    print(f'{self.name}冰箱门被打开了....')
  def close_door(self):
    print('冰箱门被关上了....')
e1=Elephant('大象')
r1=Refrigerator('海尔冰箱') 
e1.open(r1)   #将一个类的类名或者对象传给另一个类的方法中.产生了依赖关系

组合关系

组合: 将一个类的对象封装成另一个类的对象的属性.

class Boy:
  def __init__(self, name):
    self.name = name
  def meet(self, girl_friend=None):
    self.girl_friend = girl_friend # wu对象空间 : girl_friend : object对象
  def have_diner(self): # self = wu这个对象空间
    if self.girl_friend:
      print(f'{self.name}请年龄为:{self.girl_friend.age},姓名为{self.girl_friend.name}一起吃六块钱的麻辣烫')
      self.girl_friend.shopping(self) # (self = wu对象空间)
    else:
      print('单身狗,吃什么吃')
class Girl:
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def shopping(self,boy_friend):
    print(f'{boy_friend.name},{self.name}一起去购物!')
wu = Boy('吴超')
flower = Girl('如花', 48)
# 组合: 将一个类的对象封装成另一个类的对象的属性.
wu.meet(flower)
wu.have_diner()

继承关系

继承的优点:

1,增加了类的耦合性(耦合性不宜多,宜精)。

2,减少了重复代码。

3,使得代码更加规范化,合理化

继承:可以分单继承,多继承。

单继承

第一种:直接执行

class Aniaml(object):
  type_name = '动物类'

  def __init__(self,name,sex,age):
      self.name = name
      self.age = age
      self.sex = sex

  def eat(self):
    print(self)
    print('吃东西')
class Person(Aniaml):
  pass
P1=Person('alex','男','18')
# 实例化对象时必须执行__init__方法,类中没有,从父类找,父类没有,从object类中找
P1.eat()
# 先要执行自己类中的eat方法,自己类没有才能执行父类中的方法。

第二种:子类和父类都有相同功能,都想执行

class Aniaml(object):
  type_name = '动物类'
  def __init__(self,name,sex,age):
      self.name = name
      self.age = age
      self.sex = sex

  def eat(self):
    print('吃东西')

class Person(Aniaml):
  def __init__(self,name,sex,age,mind):
    super().__init__(name,sex,age) # super.__init__ 自动帮你把self 传给父类的__init__
    self.mind = mind

  def eat(self):
    super().eat()
    print('%s 吃饭'%self.name)
 
    
p1 = Person('春哥','laddboy',18,'有思想')

多继承

class A:
  pass
class B(A):
  pass
class C(A):
  pass
class D(B, C):
  pass
class E:
  pass
class F(D, E):
  pass
class G(F, D):
  pass
class H:
  pass
class Foo(H, G):
  pass

新式类的多继承

MRO是一个有序列表L,在类被创建时就计算出来。

通用计算公式为:

mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )(其中Child继承自Base1, Base2)

如果继承至一个基类:class B(A)

这时B的mro序列为

mro( B ) = mro( B(A) )
= [B] + merge( mro(A) + [A] )
= [B] + merge( [A] + [A] )
= [B,A]

如果继承至多个基类:class B(A1, A2, A3 …)

这时B的mro序列

mro(B) = mro( B(A1, A2, A3 …) )
= [B] + merge( mro(A1), mro(A2), mro(A3) ..., [A1, A2, A3] )
= ...

计算结果为列表,列表中至少有一个元素即类自己,如上述示例[A1,A2,A3]。merge操作是C3算法的核心。

4.2.2. 表头和表尾

表头:

列表的第一个元素

表尾:

列表中表头以外的元素集合(可以为空)

示例

列表:[A, B, C]

表头是A,表尾是B和C

4.2.3. 列表之间的+操作

+操作:

[A] + [B] = [A, B]
(以下的计算中默认省略)

merge操作示例:

如计算merge( [E,O], [C,E,F,O], [C] )
有三个列表 : ① ② ③

1 merge不为空,取出第一个列表列表①的表头E,进行判断
各个列表的表尾分别是[O], [E,F,O],E在这些表尾的集合中,因而跳过当前当前列表
2 取出列表②的表头C,进行判断
C不在各个列表的集合中,因而将C拿出到merge外,并从所有表头删除
merge( [E,O], [C,E,F,O], [C]) = [C] + merge( [E,O], [E,F,O] )
3 进行下一次新的merge操作 ......

以上知识点大家有没有学会么?感谢大家对三水点靠木的支持。

Python 相关文章推荐
python中Genarator函数用法分析
Apr 08 Python
解读Python编程中的命名空间与作用域
Oct 16 Python
在python中实现强制关闭线程的示例
Jan 22 Python
Python3数字求和的实例
Feb 19 Python
Win10下Python3.7.3安装教程图解
Jul 08 Python
python简单实现矩阵的乘,加,转置和逆运算示例
Jul 10 Python
Django 查询数据库并返回页面的例子
Aug 12 Python
查看Python依赖包及其版本号信息的方法
Aug 13 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
Aug 28 Python
Python二元赋值实用技巧解析
Oct 25 Python
使用python批量转换文件编码为UTF-8的实现
Apr 03 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 Python
python os.fork() 循环输出方法
Aug 08 #Python
对python中的os.getpid()和os.fork()函数详解
Aug 08 #Python
在Python中os.fork()产生子进程的例子
Aug 08 #Python
Python如何使用k-means方法将列表中相似的句子归类
Aug 08 #Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
Aug 08 #Python
python批量修改ssh密码的实现
Aug 08 #Python
更新pip3与pyttsx3文字语音转换的实现方法
Aug 08 #Python
You might like
基于php实现的验证码小程序
2016/12/13 PHP
读jQuery之十四 (触发事件核心方法)
2011/08/23 Javascript
jquery.messager.js插件导致页面抖动的解决方法
2013/07/14 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
2017/09/19 Javascript
vue中axios处理http发送请求的示例(Post和get)
2017/10/13 Javascript
Angular通过指令动态添加组件问题
2018/07/09 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
Python序列操作之进阶篇
2016/12/08 Python
Python实现快速计算词频功能示例
2018/06/25 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
python实现自动化上线脚本的示例
2019/07/01 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
Python的垃圾回收机制详解
2019/08/28 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
jupyter notebook 实现matplotlib图动态刷新
2020/04/22 Python
python 8种必备的gui库
2020/08/27 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
大专自我鉴定范文
2013/10/01 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
搞笑爱情保证书
2014/04/29 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android
python前后端自定义分页器
2022/04/13 Python