##################################################
目录
##################################################
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰;一个人摸索学习很难坚持,想组团高效学习;想写博客但无从下手,急需写作干货注入能量;热爱写作,愿意让自己成为更好的人…
…
欢迎参与CSDN学习挑战赛,成为更好的自己,请参考活动中各位优质专栏博主的免费高质量专栏资源(这部分优质资源是活动限时免费开放喔~),按照自身的学习领域和学习进度学习并记录自己的学习过程,或者按照自己的理解发布专栏学习作品!
##################################################
——————————
用实例方法执行某个功能时
如果需要使用另一个类的实例对象中的方法来完成 则称这两个类之间存在关联关系
下面的例子中:
定义了 A、B、C 三个类
在 A 类的 a() 方法中 可以使用 B 类或 C 类的实例对象作为参数
因为在 A 类方法中实现时需要 C 类实例调用 eat() 方法完成 所以这两个类之间存在依赖关系!
cmd demo:
- >>> class A:
- ... def a(self, object):
- ... object.eat()
- ... print ( "开心干饭.." )
- ...
- >>> class B():
- ... def eat(self):
- ... print ( "女朋友端来蛋炒饭(糊了)" )
- ...
- >>> class C:
- ... def eat(self):
- ... print ( "妹妹端来饺子(玉米肉馅的)" )
- ...
- >>> me = A()
- >>> mi = B()
- >>> jiao = C()
- >>> me.a(mi)
- 女朋友端来蛋炒饭(糊了)
- 开心干饭..
- >>> me.a(jiao)
- 妹妹端来饺子(玉米肉馅的)
- 开心干饭..
- >>>
注释版本 VSCode code:
- class A:
- # A 类
- def a(self, object):
- # a 方法中的 object 可以随意命名 只要传参为实例即可
- object.eat() # 调用实参对象中的 eat() 函数
- print ( "开心干饭.." )
-
- class B():
- # B 类
- def eat(self):
- # 炒糊的蛋炒饭
- print ( "女朋友端来蛋炒饭(糊了)" )
-
- class C:
- # C 类
- def eat(self):
- # 香喷喷的玉米肉馅饺子!
- print ( "妹妹端来饺子(玉米肉馅的)" )
-
- me = A() # 实例化你
- mi = B() # 实例化米饭
- jiao = C() # 实例化饺子
-
- me.a(mi) # 你吃糊米饭
- me.a(jiao) # 你吃香饺子
——————————
关联关系是什么?
一个类的属性类型是另外一个类的类型 则称这两个类之间存在关联关系
根据属性是单值或多值 关联关系又分为
一对一关联
一对多关联
等等
%%%%%
示例一对一关联:
下面例子中的 Boy 类中的属性 girl 是 Girl 类的实例对象 这两个类之间存在一对一关联关系!
VSCode code:
- class Girl:
- # 女朋友
- def __init__ (self, name):
- # 魔术方法 初始化的时候设置当前实例对象姓名
- self.name = name
-
- class Boy:
- # 男朋友
- def __init__ (self, name, girl = None): # 对象参数声明的时候 None
- # 魔术方法 初始化的时候給一个对象的属性设置成另一个类的对象
- self.girl = girl; self.name = name # new 了一个女朋友对象!!!然后当前男朋友实例对象姓名为 name
- def go(self):
- if self.girl:
- # 如果当前实例的 girl 不为空
- print ( "[", self.name, "] 说七夕了, [", self.girl.name,"] 跟我走!" )
- else:
- # 如果当前实例的 girl 为空
- print ( "七夕了留下 [", self.name , "]一个人 emo ……" )
-
- girl_1 = Girl ( "董小姐" ) # new 一个董小姐
-
- boy_1 = Boy ( "斑马", girl_1 ) # new 一个男朋友 女朋友对象是董小姐
- boy_1.go() # 男朋友开始得意
-
- boy_2 = Boy("皮皮虾") # new 一个单身狗
- boy_2.go() # 单身狗 e 了
执行结果如下 VSCode demo:
- Windows PowerShell
- 版权所有 (C) 2014 Microsoft Corporation。保留所有权利。
-
- PS C:\Users\byme> python -u "e:\PY\test.py"
- [ 斑马 ] 说七夕了, [ 董小姐 ] 跟我走!
- 七夕了留下 [ 皮皮虾 ]一个人 emo ……
- PS C:\Users\byme>
%%%%%
下面演示一对多关联:
下面例子中表示的是一对多关联
鱼塘/YuTang 类中的属性 girlList 是 鱼儿/Yu 类的实例对象集合
这两个类之间存在一对多关联关系
VSCode code:
- class YuTang:
- # 鱼塘类
-
- def __init__(self, name):
- # 魔术方法 初始化鱼塘信息
- self.girlList = [] # 这里是池塘 存放好多鱼
- self.name = name # 这是鱼儿名字
-
- def yang(self, yu):
- # 养鱼方法
- self.girlList.append (yu); print ( "[", yu.name , "]跳入鱼塘" ) # 增加一条鱼
-
- def pao(self):
- # 点名鱼儿吐泡泡方法
- for i in self.girlList:
- i.paopao()
-
- class Yu:
- # 鱼儿类
-
- def __init__ (self, name):
- # 魔术方法 初始化鱼儿信息
- self.name = name # 鱼儿名字
-
- def paopao(self):
- # 鱼儿在吐泡泡
- print ( "[", self.name , "] 吐了个泡泡.." )
-
- yt_1 = YuTang("鱼塘一号") # 实例化鱼塘对象
- print ( "鱼塘已经准备完毕..\n" )
-
- yu_1 = Yu ( "鱼儿一号" ) # 实例化鱼儿
- yu_2 = Yu ( "鱼儿二号" )
- yu_3 = Yu ( "鱼儿三号" )
- print ( "鱼儿已经准备完毕..\n" )
-
- yt_1.yang(yu_1) # 开始养鱼
- yt_1.yang(yu_2)
- yt_1.yang(yu_3)
- print ( "鱼儿已经全部进入鱼塘..\n" )
-
- yt_1.pao() # 鱼儿开始吐泡泡
- print ( "鱼儿已经全部吐完泡泡..\n" )
执行结果 VSCode demo:
- Windows PowerShell
- 版权所有 (C) 2014 Microsoft Corporation。保留所有权利。
-
- PS C:\Users\byme> python -u "e:\PY\test.py"
- 鱼塘已经准备完毕..
-
- 鱼儿已经准备完毕..
-
- [ 鱼儿一号 ]跳入鱼塘
- [ 鱼儿二号 ]跳入鱼塘
- [ 鱼儿三号 ]跳入鱼塘
- 鱼儿已经全部进入鱼塘..
-
- [ 鱼儿一号 ] 吐了个泡泡..
- [ 鱼儿二号 ] 吐了个泡泡..
- [ 鱼儿三号 ] 吐了个泡泡..
- 鱼儿已经全部吐完泡泡..
-
- PS C:\Users\byme>
——————————
类继承是在已有类基础上构建新类的机制 该新建类也成为子类
子类可以增加新的属性或功能 也可以继承父类的功能
继承所描述的是
is-a
的关系
通过继承机制可以复用以前代码大大提高了开发效率!
子类继承父类语法如下:
- class 类(父类):
- # 语句
需要注意圆括号中父类的顺序
若是父类中有相同的方法名 而在子类使用时未指定 则 Python 从左至右搜索 即:
方法在子类中未找到时从左到右查找父类中是否包含方法
%%%%%
一般来说 为防止出现歧义 尽量在类定义时候避免多继承!
这是一个单继承示例 VSCode code:
- class Ren:
- # 定义人类
-
- # 定义公有属性
- name = "" # 姓名 String 默认为空
- age = 0 # 年龄 int 默认为 0
-
- # 定义私有属性 在类外部无法直接进行访问
- __tiZhong = 0 # 体重 int
- __shenGao = 0.0 # 身高 float
-
- # 定义构造方法
- def __init__( self, n, a, t, s ):
- # 初始化类成员属性 参数分别为:当前对象, 姓名, 年龄, 体重, 身高
- self.name = n
- self.age = a
- self.__tiZhong = t
- self.__shenGao = s
-
- # 定义公有方法
- def pr(self):
- # 自我介绍
- print ( "学生 [%s] 今年 [%d] 岁 体重 [%d] 身高 [%.2f] " % ( self.name, self.age, self.__tiZhong, self.__shenGao ) )
-
- class Student(Ren):
- # 学生类 单继承一个 人类
-
- grade = '' # 年级 char 默认空
-
- def __init__( self, n, a, t, s, g ):
- # 本类构造函数 参数分别为:当前对象, 姓名, 年龄, 体重, 身高, 年级
- Ren.__init__( self, n, a, t, s ) # 调用父类构造函数 参数分别为:当前对象, 姓名, 年龄, 体重, 身高
- self.grade = g # 赋值几年级
-
- def pr(self):
- # 自我介绍
- print ( "学生 [%s] 今年 [%d] 岁 在读 [%c] 年级" % ( self.name, self.age, self.grade ) )
-
- r_1 = Ren ( "燃吹", 20, 90, 1.89 ) # 创建 父类/基类 测试对象
- r_1.pr() # 调用 父类/基类 函数
-
- stu_1 = Student ( "燃吹", 20, 90, 1.89, '4' ) # 创建 子类/派生类 测试对象
- stu_1.pr() # 调用 子类/派生类 函数
测试结果 VSCode demo:
- Windows PowerShell
- 版权所有 (C) 2014 Microsoft Corporation。保留所有权利。
-
- PS C:\Users\byme> python -u "e:\PY\test.py"
- 学生 [燃吹] 今年 [20] 岁 体重 [90] 身高 [1.89]
- 学生 [燃吹] 今年 [20] 岁 在读 [4] 年级
- PS C:\Users\byme>
%%%%%
在 Python 中使用继承机制时有以下几点需要注意:
- 子类拥有父类的属性和方法
-
- 子类可以创建自己属性和方法
-
- 子类可以对父类的方法进行覆盖实现
-
- 子类可重新定义父类中的属性
-
- 一个父类可由多个子类继承
- 一个子类也可继承多个父类
-
- 如果父类定义了
- __init__()
- 方法
- 子类也定义了自己的
- __init__()
- 方法
- 并且还要使用父类的
- __init__()
- 方法
- 子类需要显式调用父类的
- __init__()
- 方法
- 如果子类需要扩展父类的初始化行为
- 可以添加
- __init__()
- 方法参数……
-
- 当继承的多个父类中有相同的属性或方法时
- 会使用最后一个继承父类的属性或方法!