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 相关文章推荐
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
Python搜索引擎实现原理和方法
Nov 27 Python
Python内置函数—vars的具体使用方法
Dec 04 Python
Python3.6实现连接mysql或mariadb的方法分析
May 18 Python
对python添加模块路径的三种方法总结
Oct 16 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
Dec 05 Python
Python 获取指定文件夹下的目录和文件的实现
Aug 30 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
python 弧度与角度互转实例
Apr 15 Python
详解python命令提示符窗口下如何运行python脚本
Sep 11 Python
pycharm 实现光标快速移动到括号外或行尾的操作
Feb 05 Python
python中字符串String及其常见操作指南(方法、函数)
Apr 06 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调用shell的方法
2014/11/05 PHP
php通过获取头信息判断图片类型的方法
2015/06/26 PHP
PHP获取文件扩展名的方法实例总结
2017/06/10 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
JS中style属性
2006/10/11 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
jQuery包裹节点用法完整示例
2016/09/13 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
jQuery简介_动力节点Java学院整理
2017/07/04 jQuery
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[49:31]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第二场 1月29日
2021/03/11 DOTA
python读文件逐行处理的示例代码分享
2013/12/27 Python
python动态加载包的方法小结
2016/04/18 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
Python生成随机密码的方法
2017/06/16 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
2020/02/11 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
房地产财务管理制度
2014/02/02 职场文书
土地转让协议书范本
2014/04/15 职场文书
单位绩效考核方案
2014/05/11 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
安全守法证明
2015/06/23 职场文书