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编程中进行迭代和遍历
Jan 19 Python
独特的python循环语句
Nov 20 Python
python文件名和文件路径操作实例
Sep 29 Python
python线程池threadpool使用篇
Apr 27 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
May 31 Python
jupyter notebook 中输出pyecharts图实例
Apr 23 Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 Python
python设置随机种子实例讲解
Sep 12 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
Mar 24 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
python的pip有什么用
Jun 17 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
如何去掉文章里的 html 语法
2006/10/09 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
CodeIgniter框架常见用法工作总结
2017/03/16 PHP
完美的php分页类
2017/10/24 PHP
破除网页鼠标右键被禁用的绝招大全
2006/12/27 Javascript
Javascript !!的作用
2008/12/04 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
jQuery实现带玻璃流光质感的手风琴特效
2015/11/20 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
在Vue中使用Compass的方法
2018/03/02 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
Node.js实现简单管理系统
2019/09/23 Javascript
vue设置一开始进入的页面教程
2019/10/28 Javascript
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
Linux中如何设置Java环境变量(Ubuntu)
2016/07/24 面试题
最新党员思想汇报
2014/01/01 职场文书
村委会主任先进事迹
2014/01/15 职场文书
党在我心中演讲稿
2014/09/02 职场文书
领导干部考核评语
2015/01/04 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
浅析python中特殊文件和特殊函数
2022/02/24 Python
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
2022/04/08 Java/Android
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android