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使用PyFetion来发送短信的例子
Apr 22 Python
Python和JavaScript间代码转换的4个工具
Feb 22 Python
详解Golang 与python中的字符串反转
Jul 21 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
python更改已存在excel文件的方法
May 03 Python
对命令行模式与python交互模式介绍
May 12 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 Python
Pytorch训练过程出现nan的解决方式
Jan 02 Python
如何给Python代码进行加密
Jan 10 Python
Python的pygame安装教程详解
Feb 10 Python
Python使用docx模块实现刷题功能代码
Feb 13 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 include加载文件两种方式效率比较
2010/08/08 PHP
PHP中文件上传的一个问题
2010/09/04 PHP
深入PHP FTP类的详解
2013/06/13 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python 网络编程详解及简单实例
2017/04/25 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
python批量修改文件夹及其子文件夹下的文件内容
2019/03/15 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
python获取本周、上周、本月、上月及本季的时间代码实例
2020/09/08 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
CSS3实现可关闭的下拉手风琴菜单效果
2015/08/31 HTML / CSS
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
监理员的岗位职责
2013/11/13 职场文书
总经理助理工作职责
2014/02/06 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
2014迎国庆标语大全
2014/09/19 职场文书