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编写简单的定时器的方法
May 02 Python
Python使用os模块和fileinput模块来操作文件目录
Jan 19 Python
Python语言实现获取主机名根据端口杀死进程
Mar 31 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
transform python环境快速配置方法
Sep 27 Python
在python中将字符串转为json对象并取值的方法
Dec 31 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
Jan 13 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
Feb 15 Python
利用python实现逐步回归
Feb 24 Python
python cv2.resize函数high和width注意事项说明
Jul 05 Python
忆童年!用Python实现愤怒的小鸟游戏
Jun 07 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数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
php一个找二层目录的小东东
2012/08/02 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
Angular工具方法学习
2016/12/26 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
python实现删除文件与目录的方法
2014/11/10 Python
在Django的模板中使用认证数据的方法
2015/07/23 Python
python 读入多行数据的实例
2018/04/19 Python
详解Python中的type和object
2018/08/15 Python
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
python flask搭建web应用教程
2019/11/19 Python
关于抽烟的检讨书
2014/02/25 职场文书
学校四风对照检查材料
2014/08/28 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
电视新闻稿
2015/07/17 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL