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使用多线程不断刷新网页的方法
Mar 31 Python
Python文档生成工具pydoc使用介绍
Jun 02 Python
详解Python中open()函数指定文件打开方式的用法
Jun 04 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
详解Python核心编程中的浅拷贝与深拷贝
Jan 07 Python
Python zip()函数用法实例分析
Mar 17 Python
Django项目中包含多个应用时对url的配置方法
May 30 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
python爬虫爬取微博评论案例详解
Mar 27 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
Apr 24 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执行定时任务的实现思路
2015/12/21 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
jquery 快速回到页首的方法
2013/12/05 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
2014/01/31 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
2017/06/30 Javascript
深入理解Vue router的部分高级用法
2018/08/15 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
python通过smpt发送邮件的方法
2015/04/30 Python
安装dbus-python的简要教程
2015/05/05 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
python虚拟环境的安装配置图文教程
2017/10/20 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
python找出因数与质因数的方法
2019/07/25 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
Python extract及contains方法代码实例
2020/09/11 Python
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
优良学风班申请材料
2014/02/13 职场文书
建筑专业毕业生自荐信
2014/05/25 职场文书
学生会辞职信
2015/03/02 职场文书
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技