##################################################
目录
##################################################
活动简介
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰;一个人摸索学习很难坚持,想组团高效学习;想写博客但无从下手,急需写作干货注入能量;热爱写作,愿意让自己成为更好的人…
…
欢迎参与CSDN学习挑战赛,成为更好的自己,请参考活动中各位优质专栏博主的免费高质量专栏资源(这部分优质资源是活动限时免费开放喔~),按照自身的学习领域和学习进度学习并记录自己的学习过程,或者按照自己的理解发布专栏学习作品!
##################################################
Python 类间关系
——————————
Python 依赖
用实例方法执行某个功能时
如果需要使用另一个类的实例对象中的方法来完成 则称这两个类之间存在关联关系
下面的例子中:
定义了 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) # 你吃香饺子
——————————
Python 关联
关联关系是什么?
一个类的属性类型是另外一个类的类型 则称这两个类之间存在关联关系
根据属性是单值或多值 关联关系又分为
一对一关联
一对多关联
等等
%%%%%
一对一关联
示例一对一关联:
下面例子中的 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>
——————————
Python 继承
类继承是在已有类基础上构建新类的机制 该新建类也成为子类
子类可以增加新的属性或功能 也可以继承父类的功能
继承所描述的是
is-a
的关系
通过继承机制可以复用以前代码大大提高了开发效率!
子类继承父类语法如下:
class 类(父类):
# 语句
需要注意圆括号中父类的顺序
若是父类中有相同的方法名 而在子类使用时未指定 则 Python 从左至右搜索 即:
方法在子类中未找到时从左到右查找父类中是否包含方法
%%%%%
示例 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 继承机制
在 Python 中使用继承机制时有以下几点需要注意:
子类拥有父类的属性和方法
子类可以创建自己属性和方法
子类可以对父类的方法进行覆盖实现
子类可重新定义父类中的属性
一个父类可由多个子类继承
一个子类也可继承多个父类
如果父类定义了
__init__()
方法
子类也定义了自己的
__init__()
方法
并且还要使用父类的
__init__()
方法
子类需要显式调用父类的
__init__()
方法
如果子类需要扩展父类的初始化行为
可以添加
__init__()
方法参数……
当继承的多个父类中有相同的属性或方法时
会使用最后一个继承父类的属性或方法!