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调用新浪微博API项目实践
Jul 28 Python
python简单实现基数排序算法
May 16 Python
CentOS下使用yum安装python-pip失败的完美解决方法
Aug 16 Python
Python字典数据对象拆分的简单实现方法
Dec 05 Python
matplotlib给子图添加图例的方法
Aug 03 Python
解决django前后端分离csrf验证的问题
Feb 03 Python
Python自动化运维之Ansible定义主机与组规则操作详解
Jun 13 Python
python 求某条线上特定x值或y值的点坐标方法
Jul 09 Python
Django model select的多种用法详解
Jul 16 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
Jupyter Notebook添加代码自动补全功能的实现
Jan 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程序
2006/10/09 PHP
谈谈新手如何学习PHP
2006/12/14 PHP
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
js获取图片宽高的方法
2015/11/25 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
轻松搞定jQuery+JSONP跨域请求的解决方案
2018/03/06 jQuery
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
Vue触发隐藏input file的方法实例详解
2019/08/14 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
Python使用django搭建web开发环境
2017/06/09 Python
Python3生成手写体数字方法
2018/01/30 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
MYSQL支持事务吗
2013/08/09 面试题
大学生创业计划书的格式要求
2013/12/29 职场文书
高中体育教学反思
2014/01/24 职场文书
竞选村长演讲稿
2014/04/28 职场文书
党性心得体会
2014/09/03 职场文书
银行授权委托书范本
2014/10/04 职场文书
导游词之扬州大明寺
2019/10/09 职场文书