Pyhon进阶9---类的继承

类的继承

基本概念

定义

格式如下

继承中的访问控制

class Animal:__CNOUT = 0HEIGHT = 0def __init__(self,age,weight,height):self.__CNOUT =self.__CNOUT + 1self.age = ageself.__weight = weightself.HEIGHT = heightdef eat(self):print('{} eat'.format(self.__class__.__name__))def __getweight(self):print(self.__weight)@classmethoddef showcount1(cls):print(cls.__CNOUT)@classmethoddef __showcount2(cls):print(cls.__CNOUT)class Cat(Animal):NAME = 'CAT'c = Cat(3,5,15)
c.eat()
c.showcount1()#注意此处的cls.__COUNT仍为0print(c.NAME)
print(c.__dict__)#{'_Animal__CNOUT': 1, 'age': 3, '_Animal__weight': 5, 'HEIGHT': 15}
print(Cat.__dict__)#{'__module__': '__main__', 'NAME': 'CAT', '__doc__': None}
print(Animal.__dict__)#{'__module__': '__main__', '_Animal__CNOUT': 0, 'HEIGHT': 0,...}

 

方法的重写、覆盖override

class Animal:def shout(self):print('Animal shout')class Cat(Animal):#覆盖父类的方法def shout(self):print('miao')#覆盖自身的方法,显示调用了父类的方法def shout(self):print(super(Cat, self))super().shout()a = Animal()
a.shout()
c =Cat()
c.shout()#输出结果:
# Animal shout
# <super: <class 'Cat'>, <Cat object>>
# Animal shout

 

class Animal:@classmethoddef class_method(cls):print('class_method_animal')@staticmethoddef static_method():print('static_method_animal')class Cat(Animal):@classmethoddef class_method(cls):print('class_method_cat')@staticmethoddef static_method():print('static_method_cat')c = Cat()
c.class_method()
c.static_method()
#输出结果:
# class_method_cat
# static_method_cat

继承中的初始化

示例1

class A:def __init__(self):self.a1 = 'a1'self.__a2 = 's2'print('A init')class B(A):pass
b = B()
print(b.__dict__)       #{'a1': 'a1', '_A__a2': 's2'}

示例2

class A:def __init__(self):self.a1 = 'a1'self.__a2 = 's2'print('A init')class B(A):def __init__(self):self.b1 = 'b1'print('B init')
b = B()
print(b.__dict__)    #{'b1': 'b1'}

class A:def __init__(self):self.a1 = 'a1'self.__a2 = 's2'print('A init')class B(A):def __init__(self):# A.__init__(self)# super(B,self).__init__()super().__init__()self.b1 = 'b1'print('B init')
b = B()
print(b.__dict__)   #{'a1': 'a1', '_A__a2': 's2', 'b1': 'b1'}

如何正确初始化

 

class Animal:def __init__(self,age):print('Animal init')self.age =agedef show(self):print(self.age)class Cat(Animal):def __init__(self,age,weight):super().__init__(age)#c.show()结果为11print('Cat init')self.age = age + 1self.weight = weight# super().__init__(age)#c.show()结果为10
c = Cat(10,5)
c.show()   
# c.__dict__ {'age': 11, 'weight': 5}

class Animal:def __init__(self,age):print('Animal init')self.__age =agedef show(self):print(self.__age)class Cat(Animal):def __init__(self,age,weight):super().__init__(age)print('Cat init')self.__age = age + 1self.__weight = weight
c = Cat(10,5)
c.show()
print(c.__dict__)#{'_Animal__age': 10, '_Cat__age': 11, '_Cat__weight': 5}

 

Python不同版本的类

多继承

 

多继承弊端

Python多继承实现

class ClassName(基类列表):类体

多继承的缺点

Mixin

class Printable:def _print(self):print(self.content)class Document:#假设为第三方库,不允许修改def __init__(self,content):self.content = contentclass Word(Document):pass#假设为第三方库,不允许修改
class Pdf(Document):pass#假设为第三方库,不允许修改class PrintableWord(Printable,Word):pass
print(PrintableWord.__dict__)
print(PrintableWord.mro())
pw = PrintableWord('test string')
pw._print()

  

def printable(cls):def _print(self):print(self.content,'装饰器')cls.print = _printreturn clsclass Document:#假设为第三方库,不允许修改def __init__(self,content):self.content = contentclass Word(Document):pass#假设为第三方库,不允许修改
class Pdf(Document):pass#假设为第三方库,不允许修改

@printable
class PrintableWord(Word):passprint(PrintableWord.__dict__)#{'__module__': '__main__', '__doc__': None, 'print': <function printable.<locals>._print at 0x0000000002961730>}
PrintableWord('test').print()#test 装饰器

4.Mixin

#Mixin示例1
class PrintableMixin:def print(self):print(self.content,'Mixin')class Document:def __init__(self,content):self.content = contentclass Word(Document):pass
class Pdf(Document):passclass PrintableWord(PrintableMixin,Word):pass
print(PrintableWord.__dict__)
print(PrintableWord.mro())pw = PrintableWord('test\nstring')
pw.print()

 

#Mixin示例2
class PrintableMixin:def print(self):print(self.content,'Mixin')class Document:def __init__(self,content):self.content = contentclass Word(Document):pass
class Pdf(Document):passclass SuperPrintableMixin(PrintableMixin):def print(self):print('~'*20)super().print() #通过继承复用print('~'*20)class SuperPrintablePdf(SuperPrintableMixin,Pdf):pass
print(SuperPrintablePdf.__dict__)
print(SuperPrintablePdf.mro())spp = SuperPrintablePdf('super print pdf')
spp.print()

Mixin类

 练习

#1.Shape基类,要求所有子类都必须提供面积的计算,子类有三角形、矩形、圆
import  mathclass Shape:@propertydef area(self):raise NotImplementedError('基类未实现')class Triangle(Shape):def __init__(self,a,b,c):self.a = aself.b = bself.c = c@propertydef area(self):p  = (self.a+self.b+self.c)/2return math.sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))class Circle(Shape):def __init__(self,radius):self.radius = radius@propertydef area(self):return math.pi*self.radius**2class Rectangle(Shape):def __init__(self,width,height):self.width = widthself.height = height@propertydef area(self):return self.width*self.height# shapes = [Triangle(3,4,5),Rectangle(3,4),Circle(4)]
# for s in shapes:
#     print('The area of {} = {}'.format(s.__class__.__name__,s.area))#2.圆类的数据可序列化
import json
import msgpackdef mydump(cls):def _dumps(self, t='json'):if t == 'json':return json.dumps(self.__dict__)elif t == 'msgpack':return msgpack.packb(self.__dict__)else:raise NotImplementedError('没有实现的序列化')cls.dumps = _dumpsreturn cls#使用Mixin类
# class SerializableMixin:
#     def dumps(self,t='json'):
#         if t == 'json':
#             return json.dumps(self.__dict__)
#         elif t == 'msgpack':
#             return msgpack.packb(self.__dict__)
#         else:
#             raise NotImplementedError('没有实现的序列化')
#
#使用装饰器
@mydump
class SerializableCircleMixin(Circle):passscm  = SerializableCircleMixin(1)
print(scm.area)#3.141592653589793
print(scm.__dict__)#{'radius': 1}
print(scm.dumps('json'))#{"radius": 1}

 作业

 

#单链表
class SingleNode:#代表一个节点def __init__(self,val,next=None):self.val = valself.next = Noneclass LinkedList:#容器类,某种方式存储一个个节点def __init__(self):self.head = Noneself.tail = Nonedef append(self,val):node = SingleNode(val)if self.head is None:# 0self.head = nodeself.tail = nodeself.tail.next = nodeself.tail = nodedef iternodes(self):while self.head:yield self.head.valself.head = self.head.next
 1 #实现双向链表
 2 class SingleNode:
 3     #代表一个节点
 4     def __init__(self,val,next=None,prev=None):
 5         self.val = val
 6         self.next = next
 7         self.prev = prev
 8 
 9     def __repr__(self):
10         return str(self.val)
11 
12 class LinkedList:
13     #容器类,某种方式存储一个个节点
14     def __init__(self):
15         self.head = None
16         self.tail = None
17 
18     def append(self,val):
19         node = SingleNode(val)
20         if self.head is None:# 0
21             self.head = node
22         else:
23             self.tail.next = node
24             node.prev = self.tail
25         self.tail = node
26 
27     def pop(self):
28         if self.tail is None:#0
29             raise NotImplementedError('Empty')
30         tail = self.tail
31         prev= self.tail.prev
32         if prev is None:#1个节点
33             self.head = None
34             self.tail = None
35         else:#>1
36             self.tail = prev
37             prev.next = None
38         return tail.val
39 
40 
41     def insert(self,index,val):#1,7
42         if index < 0:
43             raise Exception('Error')
44         cur = None
45         for i,current in enumerate(self.iternodes()):
46             if i == index:
47                 cur = current
48                 break
49 
50         if cur is None:#说明索引越界或空链表,直接末尾追加
51             self.append(val)
52             return
53 
54         node = SingleNode(val)
55         prev = cur.prev
56         if prev is None:#1个节点,头部插入
57             self.head = node
58             node.next = cur
59             cur.prev = node
60         else:#>=2
61             node.next = cur
62             prev.next = node
63             cur.prev = node
64             node.prev = prev
65 
66     def iternodes(self,reversed = False):
67         current = self.head
68         while current:
69             yield current
70             current = current.next
71 
72 a = SingleNode(1)
73 b = SingleNode(2)
74 c = SingleNode(3)
75 d = SingleNode(4)
76 e = SingleNode(5)
77 f = SingleNode(6)
78 ll = LinkedList()
79 ll.append(a)
80 ll.append(b)
81 ll.append(c)
82 ll.append(d)
83 ll.append(e)
84 ll.append(f)
85 # ll.insert(1,0)
86 # ll.insert(0,0)
87 ll.insert(10,100)
88 print('pop元素:',ll.pop())
89 print('pop元素:',ll.pop())
90 print('pop元素:',ll.pop())
91 ll.insert(0,10)
92 
93 for node in ll.iternodes():
94     print(node)

转载于:https://www.cnblogs.com/xiaoshayu520ly/p/10727958.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

quartz教程二

转载于:https://www.cnblogs.com/mumian2/p/10729901.html

python把图片转为字符画_Python 实现图片转换为字符画

主要使用 pillow如果没有安装 使用 pillow install pillow 安装一下看代码&#xff1a;from PIL import Imageimport argparse#字符画所用的字符集ascii_char list("$B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_~<>i!lI;:,\"^. ")def get…

76. Minimum Window Substring

最后更新 一刷 08-Jan-2017 昨天Amazon group面结束&#xff0c;刚回家。 国内以前喜欢的女生结婚了&#xff0c;嘿嘿...好开心呀~~ 这次面试感觉自己的做法完爆别人&#xff0c;比什么2 greedy好多了 总之表现比想象的好&#xff0c;最后一面的面试官真是聪明得一逼&#xff…

mysql浅拷贝_深拷贝与浅拷贝

在Python中&#xff0c;对象赋值实际上是对象的引用。当创建一个对象&#xff0c;然后把它赋给另一个变量的时候&#xff0c;Python并没有拷贝这个对象&#xff0c;而只是拷贝了这个对象的引用。1、浅拷贝&#xff1a;利用切片操作、工厂方法list方法拷贝2、深拷贝&#xff1a;…

iOS中的颜色

最近在改Bug的时候&#xff0c;才注意到iOS 中的颜色竟然也大有文章&#xff0c;特来记录一下。 先说一下问题&#xff0c;因为某界面中有用xib实现的一个view&#xff0c;而这个view 只在UIColletionView的layout 里通过nib 注册使用&#xff0c;为这个xib设置了背景色&#x…

多线程的基础知识

1、程序、进程、线程的基本概念 程序&#xff1a;为了完成某种任务用某一种语言编写的一组指令的集合就叫程序。程序就是一段静态的代码。 进程&#xff1a;进程是程序的依次执行过程&#xff0c;或者说是正在运行的一个程序。这是一个动态的过程&#xff0c;有它自身的产生运行…

springboot实现单点登录_什么是单点登录,php是如何实现单点登录的

文章来自&#xff1a;php中文网链接&#xff1a;https://www.php.cn/php-weizijiaocheng-429869.html作者&#xff1a;中文网商务合作:请加微信(QQ)&#xff1a;2230304070视频教程分享码农网&#xff1a;http://www.mano100.cn/rjyfk_url-url.html &#xff0c;升级终身会员即…

背景图处理,这是个好东西记录一下

背景图处理 rgba &#xff08;&#xff09;&#xff0c;前3个是三原色&#xff0c;第四个参数是透明度转载于:https://www.cnblogs.com/ChineseLiao/p/7479207.html

python使用GUI(图形用户界面)

打开后&#xff1a; File→New File(Ctrl N) 转载于:https://www.cnblogs.com/ly123456/p/6269859.html

Altium Designer(AD24)新工程复用设计文件图文教程及视频演示

&#x1f3e1;《专栏目录》 目录 1&#xff0c;概述2&#xff0c;复用方法一视频演示2.1&#xff0c;创建工程2.2&#xff0c;复用设计文件 3&#xff0c;复用方法二视频演示4&#xff0c;总结 欢迎点击浏览更多高清视频演示 1&#xff0c;概述 本文简述使用AD软件复用设计文件…

Oracle 学习笔记(三)

oracle 表查询 oracle 表基本查询 在此&#xff0c;基于 scott 用户存在的 emp&#xff0c;dept 表演示学习。 emp 雇员表 clerk 员工 salesman 销售 manager 经理 analyst 分析师 president 总裁 mgr 上级的编号 hiredate 入职时间 sal 工资 comm 奖金 deptno 部…

html meta标签使用总结(转)

之前学习前端中&#xff0c;对meta标签的了解仅仅只是这一句。 <meta charset"UTF-8"> 但是打开任意的网站&#xff0c;其head标签内都有一列的meta标签。比如我博客的。 但是自己却很不熟悉&#xff0c;于是把meta标签加入了寒假学习计划的最前方。 简介 在查…

redhat6 删除mysql_Red Hat enterprise linux 6卸载默认安装的 mysql

因为Red Hat enterprise linux 6 自带了一个mysql&#xff0c;所以当你安装新的mysql时&#xff0c;就会提示错误如&#xff1a;error&#xff1a;Failed dependencies&#xff1a;MySQL conflicts with mysql-5.1.47-4.el6.i686rmp -qa mysql 可以看到安装的mysql于是将自带的…

Jenkins持续集成实践之java项目自动化部署

关于Linux安装Jenkins可以参考我的这篇博文Ubuntu16.04环境安装jenkins 1.安装部署插件 进入插件管理&#xff0c;并搜索该插件Deploy to container Plugin进行安装 &#xff0c;下载地址为&#xff1a;https://wiki.jenkins-ci.org/display/JENKINS/DeployPlugin 2.安装完后&a…

Java 多线程 笔记 转自http://www.cnblogs.com/lwbqqyumidi/p/3804883.html

多线程作为Java中很重要的一个知识点&#xff0c; 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期&#xff0c;首先看一下下面这张较为经典的图&#xff1a; 上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点&#xff0c;Java中的多线程也就基…

c/c++连接mysql数据库设置及乱码问题(vs2013连接mysql数据库,使用Mysql API操作数据库)...

我的安装环境&#xff1a; (1)vs2013(32位版) (vs2013只有32位的 没有64位的&#xff0c;但是它可以编译出64位的程序) &#xff1b; (2)mysql-5.7.15(64位) vs2013中的设置&#xff08;按步骤来&#xff0c;顺序不要乱&#xff09; (1)首先在vs2013中新建一个控制台程序 Mysq…

调用接口返回500_公交卡余额查询接口开放使用啦!

API说明本API返回数据仅支持JSON格式且会对中文进 行unicode 编码&#xff0c;JSON格式返回数据基本格式如下&#xff1a;{"errCode": 0,"errMsg": "OK","data": {}}其中 errCode 表示请求状态&#xff0c;0表示请求成功&#xff0c; …

stark组件开发之组合搜索基本显示

数据的获取&#xff0c;上一篇&#xff0c;已经有了&#xff01;然后就是&#xff0c;如何进行展示的问题。到了展示这里&#xff0c;又有了新的问题&#xff0c; 因为从数据库&#xff0c;取得的数据。 分为 queryset 和 tuple 两种数据结构。tuple 中&#xff0c;只是字符串。…

原生支付url参数错误_小程序支付

下载微信JSAPI支付的 SDK : https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php.zip &#xff1b;解压后放在extend 文件夹下&#xff0c;命名为wepay下载你的商户证书&#xff0c;放在extend/wepay/cert/ 文件夹下面。自行将 extend/wepay/example/WxPay.Config.p…

枚举转中文,通过反射方法与描述的方式获取

示例&#xff1a; 有人为了显示中文&#xff0c;这样定义枚举吗&#xff1f; publicenum TimeOfDay { 上午, 下午, 晚上 }; 这样定义&#xff0c;很别扭&#xff0c;特别是在使用的时候&#xff0c; 比如&#xff0c;this.Time TimeOfDay.上午; 而…