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 19 Python
Python实现学校管理系统
Jan 11 Python
python实现简单淘宝秒杀功能
May 03 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
numpy.linspace 生成等差数组的方法
Jul 02 Python
Python类的继承用法示例
Jan 31 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
pandas DataFrame 数据选取,修改,切片的实现
Apr 24 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
python实现简单遗传算法
Sep 18 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 empty函数判断mysql表单是否为空
2010/04/12 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
MooTools 1.2介绍
2009/09/14 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
JS实现移动端按首字母检索城市列表附源码下载
2017/07/05 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
webpack3升级到webpack4遇到问题总结
2019/09/30 Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
2019/10/25 Javascript
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
django settings.py 配置文件及介绍
2019/07/15 Python
np.random.seed() 的使用详解
2020/01/14 Python
python interpolate插值实例
2020/07/06 Python
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
亮化工程实施方案
2014/03/17 职场文书
青蓝工程实施方案
2014/03/27 职场文书
音乐节策划方案
2014/06/09 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
幼儿园教师安全责任书
2015/05/08 职场文书
公司2015年终工作总结
2015/05/26 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS