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类定义的讲解
Nov 01 Python
python实现在sqlite动态创建表的方法
May 08 Python
python计算一个序列的平均值的方法
Jul 11 Python
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
详解python eval函数的妙用
Nov 16 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
python实现旋转和水平翻转的方法
Oct 25 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
python pands实现execl转csv 并修改csv指定列的方法
Dec 12 Python
解决python xlrd无法读取excel文件的问题
Dec 25 Python
Python创建空列表的字典2种方法详解
Feb 13 Python
使用scrapy实现增量式爬取方式
Jun 21 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
上海无线电三厂简史修改版
2021/03/01 无线电
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
thinkPHP框架整合tcpdf插件操作示例
2018/08/07 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
PHP创建对象的六种方式实例总结
2019/06/27 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
详解如何使用koa实现socket.io官网的例子
2018/11/04 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
python将人民币转换大写的脚本代码
2013/02/10 Python
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
VTK与Python实现机械臂三维模型可视化详解
2017/12/13 Python
python实现超市扫码仪计费
2018/05/30 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
Python使用pyexecjs代码案例解析
2020/07/13 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
2020/10/14 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
银行会计财务工作个人的自我评价
2013/10/29 职场文书
酒店前厅员工辞职信
2014/01/08 职场文书
2014年销售人员工作总结
2014/11/27 职场文书
行政复议答复书
2015/07/01 职场文书
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
2021/06/09 Python
Python matplotlib多个子图绘制整合
2022/04/13 Python
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL