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编写检测数据库SA用户的方法
Jul 11 Python
python制作websocket服务器实例分享
Nov 20 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
Apr 19 Python
Python使用time模块实现指定时间触发器示例
May 18 Python
分析Python读取文件时的路径问题
Feb 11 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 Python
python文本数据相似度的度量
Mar 12 Python
python将文本中的空格替换为换行的方法
Mar 19 Python
实例分析python3实现并发访问水平切分表
Sep 29 Python
PyTorch中常用的激活函数的方法示例
Aug 20 Python
Python:slice与indices的用法
Nov 25 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 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 file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
有关于PHP中常见数据类型的汇总分享
2014/01/06 PHP
PHP时间类完整代码实例
2021/02/26 PHP
javascript 最常用的10个自定义函数[推荐]
2009/12/26 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
在vue项目中引入高德地图及其UI组件的方法
2018/09/04 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
原生js实现获取form表单数据代码实例
2019/03/27 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
2020/07/28 Javascript
python获取当前时间对应unix时间戳的方法
2015/05/15 Python
浅谈Python中的闭包
2015/07/08 Python
Python3 模块、包调用&路径详解
2017/10/25 Python
tornado 多进程模式解析
2018/01/15 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
详解python3中的真值测试
2018/08/13 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
pytorch SENet实现案例
2020/06/24 Python
python如何实现图片压缩
2020/09/11 Python
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
Nike荷兰官方网站:Nike.com (NL)
2018/04/19 全球购物
医学生实习自我鉴定
2013/09/27 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
2016年父亲节寄语
2015/12/04 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python