python面向对象编程(封装与继承)_使用py的面向对象编程,类的封装和继承代码

本文介绍了Python面向对象编程中的继承机制,包括单继承、多继承的工作原理,以及如何重写父类方法。同时,通过链表类的实例演示了如何使用继承和私有属性。
摘要由CSDN通过智能技术生成

p3 = People(‘小红’,‘22’,‘女’)

p1.shopping()
p2.shopping()
p3.learning()


代码运行结果:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210304102558116.png)


### 3 . 继承特性


面向对象的三大特性是指:封装、继承和多态


1. 继承
2. 多继承
3. 私有属性与私有方法


继承描述的是事物之间的所属关系,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类、扩展类(Subclass),而被继承的class称为基类、父类或超类(Baseclass、  
 Superclass)。


* 问题一: 如何让实现继承?  
 子类在继承的时候,在定义类时,小括号()中为父类的名字
* 问题二: 继承的工作机制是什么?  
 父类的属性、方法,会被继承给子类。 举例如下: 如果子类没有定义\_\_init\_\_方法,父类有,那么在子类继承父类的时候这个方法就被继承了,所以只要创建对象,就默认执行了那个继承过来的\_\_init\_\_方法



class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def learning(self):
print(f’{self.name}正在学习’)
class MathStudent(Student):
“”“MathStudent的父类是student”“”
pass

#实例化
m1 = MathStudent(‘华罗庚’,88)
print(m1.name)
print(m1.age)
m1.learning() #子类没有就会去父类找

m1.choice_course() #子类和父类都没有就会报错


代码运行结果:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210304104703111.png)


### 4 . 重写父类方法


就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法。



class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def learning(self):
print(f’{self.name}正在学习’)

def choice\_course(self):
    print('正在选课中'.center(50,'\*'))

class MathStudent(Student):
“”“MathStudent的父类是student”“”
def choice_course(self):
# 需求:先执行父类的方法choice_course,再个性化执行自己的方法
#Student.choice_course(self) #方法1:直接执行父类的方法,但不建议
#方法2:通过super找到父类的方法,再执行()中的。
super(MathStudent,self).choice_course()
info = “”"
课程表

  1. 高数
  2. 线性代数
  3. 概率论
    “”"
    print(info)

#实例化
m1 = MathStudent(‘华罗庚’,88)
m1.choice_course()


代码运行结果:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210304110138449.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bl9fcw==,size_16,color_FFFFFF,t_70)


### 5 . 练习


[两数相加力扣网址]( )  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210304112836644.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bl9fcw==,size_16,color_FFFFFF,t_70)  
 直接在力扣上做,代码如下:



#Definition for singly-linked list.

class ListNode:

def __init__(self, val=0, next=None):

self.val = val

self.next = next

class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
res = 0
l3 = ListNode()
cur = l3
while(l1 or l2):
if(l1):
res += l1.val # res=2
l1 = l1.next
if(l2):
res += l2.val # res=2+5=7
l2 = l2.next
# res=10, val=0, res=>val val=res%10
# res=14, val=4, 14%10=4
l3.next = ListNode(res%10)
l3 = l3.next
# res=10, 进位为1, 10//10=1
# res=14, 进位为1, 14//10=1
res //= 10
if res == 1:
l3.next = ListNode(1)
return cur.next


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210306142113450.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bl9fcw==,size_16,color_FFFFFF,t_70)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210306142133549.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bl9fcw==,size_16,color_FFFFFF,t_70)


### 6 . 链表的封装



“”"
参考链接 https://www.cnblogs.com/klyjb/p/11237361.html
数组: 需要连续的内存空间
链表: 不需要连续的内存空间
数组 链表
增加元素 O(n) O(1)
删除元素 O(n) O(1)
修改元素 O(1) O(n)
查看元素 O(1) O(n)
“”"

封装节点类

class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next

def travel(self, head):
    """遍历链表里面的每一个元素"""
    while head:
        print(head.val, end=',')
        head = head.next

def create_l1():
# l1 = 2,4,3
# l2 = 5, 6, 4
l1 = ListNode()
node1 = ListNode(val=2)
node2 = ListNode(val=4)
node3 = ListNode(val=3)
l1.next = node1
node1.next = node2
node2.next = node3
return l1.next

def create_l2():
# l1 = 2,4,3
# l2 = 5, 6, 4
l2 = ListNode()
node1 = ListNode(val=5)
node2 = ListNode(val=6)
node3 = ListNode(val=4)
l2.next = node1
node1.next = node2
node2.next = node3
return l2.next

def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:
res = 0
l3 = ListNode()
cur = l3
while(l1 or l2):
if(l1):
res += l1.val # res=2
l1 = l1.next
if(l2):
res += l2.val # res=2+5=7
l2 = l2.next
# res=10, val=0, res=>val val=res%10
# res=14, val=4, 14%10=4
l3.next = ListNode(res%10)
l3 = l3.next
# res=10, 进位为1, 10//10=1
# res=14, 进位为1, 14//10=1
res //= 10
if res == 1:
l3.next = ListNode(1)
return cur.next

if name == ‘__main__’:
l1 = create_l1()
l2 = create_l2()
l3 = addTwoNumbers(l1, l2)
l3.travel(l3)


### 7. 多继承


多继承,即子类有多个父类,并且具有它们的特征


在Python 2及以前的版本中,由任意内置类型派生出的类,都属于“新式  
 类”  
 ,都会获得所有“新式类”的特性;反之,即不由任意内置类型派生出的类,  
 则称之为“经典类”。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210304114110587.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bl9fcw==,size_16,color_FFFFFF,t_70)  
 “新式类”和“经典类”的区分在Python 3之后就已经不存在,在Python 3.x之后的版本,因为所有的类都派生自内置类型object(即使没有显示的继承object类型),即所有的类都是“新式类”。  
 最明显的区别在于继承搜索的顺序不同,即:  
 经典类多继承搜索顺序(深度优先算法):先深入继承树左侧查找,然后再返回,开始查找右侧。  
 新式类多继承搜索顺序(广度优先算法):先在水平方向查找,然后再向上查找,  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210304114149191.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bl9fcw==,size_16,color_FFFFFF,t_70)



“”"
新式类: 广度优先算法
经典类: 深度优先算法(py2中的部分类属于经典类)

python3所有的类都属于新式类。新式类的继承算法是广度优先。

分析多继承的相关代码

pip install djangorestframework
from rest_framework import viewsets
viewsets.ModelViewSet
“”"

class D(object):
def hello(self):
print(‘D’)
class C(D):
# def hello(self):
# print(‘C’)
pass
class B(D):
pass
# def hello(self):
# print(‘B’)
class A(B, C):
pass
# def hello(self):
# print(‘A’)
a = A()
a.hello()


## 四、私有属性和私有方法


默认情况下,属性在 Python 中都是“public”, 大多数 OO 语言提供“访问控制符”来限定成员函数的访问。  
 在 Python 中,实例的变量名如果以 \_\_ 开头,就变成了一个私有变量/属性  
 (private),实例的函数名如果以 \_\_ 开头,就变成了一个私有函数/方法(private)只  
 有内部可以访问,外部不能访问。



class Student:
“”“父类Student”“”
def __init__(self, name, age, score):
self.name = name
self.age = age
# 私有属性,以双下划线开头。
# 工作机制: 类的外部(包括子类)不能访问和操作,类的内部可以访问和操作。
self.__score = score

def learning(self):
    print(f'{self.name}正在学习')

def get\_score(self):
    self.__modify_score()
    return  self.__score

# 私有方法是以双下划线开头的方法,
#工作机制: 类的外部(包括子类)不能访问和操作,类的内部可以访问和操作。
def \_\_modify\_score(self):
    self.__score += 20

class MathStudent(Student):
“”“MathStudent的父类是Student”“”
def get_score(self):
self.__modify_score()
return self.__score

最后

🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值