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决策树之CART分类回归树详解
Dec 20 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
Jun 09 Python
Python3实现转换Image图片格式
Jun 21 Python
python实现指定字符串补全空格、前面填充0的方法
Nov 16 Python
python实现连续图文识别
Dec 18 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
在Python中构建增广矩阵的实现方法
Jul 01 Python
Python 如何操作 SQLite 数据库
Aug 17 Python
Python尾递归优化实现代码及原理详解
Oct 09 Python
selenium学习教程之定位以及切换frame(iframe)
Jan 04 Python
python制作图形界面的2048游戏, 基于tkinter
Apr 06 Python
Python可变集合和不可变集合的构造方法大全
Dec 06 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
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
PHP类相关知识点实例总结
2016/09/28 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
用js重建星际争霸
2006/12/22 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
bootstrap模态框垂直居中效果
2016/12/03 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
Angularjs上传图片实例详解
2017/08/06 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
js实现随机数小游戏
2019/06/28 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
Python splitlines使用技巧
2008/09/06 Python
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
波兰补充商店:Muscle Power
2018/10/29 全球购物
五年后的职业生涯规划
2014/03/04 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
思想工作总结范文
2015/08/12 职场文书
文明上网主题班会
2015/08/14 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
详解如何使用Nginx解决跨域问题
2022/05/06 Servers