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 相关文章推荐
在GitHub Pages上使用Pelican搭建博客的教程
Apr 25 Python
Python和JavaScript间代码转换的4个工具
Feb 22 Python
Python3.4编程实现简单抓取爬虫功能示例
Sep 14 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
tensorflow获取变量维度信息
Mar 10 Python
对python的unittest架构公共参数token提取方法详解
Dec 17 Python
python 产生token及token验证的方法
Dec 26 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
Python从入门到精通之环境搭建教程图解
Sep 26 Python
Python日志logging模块功能与用法详解
Apr 09 Python
django有哪些好处和优点
Sep 01 Python
python 中关于pycharm选择运行环境的问题
Oct 31 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
让你同时上传 1000 个文件 (一)
2006/10/09 PHP
php抽奖小程序的实现代码
2013/06/18 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
php实现的任意进制互转类分享
2015/07/07 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
JavaScript 高效运行代码分析
2010/03/18 Javascript
jquery 列表双向选择器之改进版
2013/08/09 Javascript
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
jquery果冻抖动效果实现方法
2015/01/15 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
Vue如何获取数据列表展示
2019/12/11 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
将Python文件打包成.EXE可执行文件的方法
2019/08/11 Python
Python argparse模块应用实例解析
2019/11/15 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
内业资料员岗位职责
2014/01/04 职场文书
新年寄语大全
2014/04/12 职场文书
建设投标担保书
2014/05/13 职场文书
2016春节家属慰问信
2015/03/25 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书
python代码实现扫码关注公众号登录的实战
2021/11/01 Python