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中的len()函数的使用
Apr 07 Python
Python中的map()函数和reduce()函数的用法
Apr 27 Python
python直接获取API传递回来的参数方法
Dec 17 Python
对Python中画图时候的线类型详解
Jul 07 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
Python下利用BeautifulSoup解析HTML的实现
Jan 17 Python
Python PyPDF2模块安装使用解析
Jan 19 Python
python实现俄罗斯方块小游戏
Apr 24 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
在pytorch中动态调整优化器的学习率方式
Jun 24 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 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使用者状态管理功能的应用
2006/10/09 PHP
php中防止SQL注入的最佳解决方法
2013/04/25 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
jQuery ready函数滥用分析
2011/02/16 Javascript
js实现图片拖动改变顺序附图
2014/05/13 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
2014/11/23 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
python中异常报错处理方法汇总
2016/11/20 Python
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
Python读取word文本操作详解
2018/01/22 Python
Python实现的栈(Stack)
2018/01/26 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
利用CSS3的checked伪类实现OL的隐藏显示的方法
2010/12/18 HTML / CSS
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
创业计划书的主要内容有哪些
2014/01/29 职场文书
网站美工岗位职责
2014/04/02 职场文书
红白喜事主持词
2015/07/06 职场文书
企业年会祝酒词
2015/08/11 职场文书