面向对象的编程思想和Python的类,访问和属性,继承 在上一文中我们了解到了,私有的属性的访问方式:实例名._类名__私有属性名。

一、私有的属性如何对外提供公有的取值和赋值方法呢?提供公有的方法作为接口进行取值

例如:

class Avg_Score:# 平均成绩类

def __init__(self,num1,num2,num3):

self.set_num(num1,num2,num3)

def num_avg(self): #计算机求平均数的方法

return (self.__num3+self.__num2+self.__num1)/3 #返回平均成绩

def get_num(self):

return self.num1,self.num2,self.num3

def set_num(self, num1,num2,num3):#赋值方法

if 0 <= num1 <= 120:

self.__num1 = num1

if 0 <= num2 <= 120:

self.__num2 = num2

if 0 <= num3 <= 120:

self.__num3 = num3

else:

raise ValueError('您输入的成绩不在范围内,请重新输入')

avg=Avg_Score(9,6,7)#创建类的实例

print('三科成绩之和为:',avg.num_avg())#类的实例,调用属性,得到属性值

print('语文成绩为:',avg._Avg_Score__num1)#进行私有属性的取值

二、多继承的执行顺序

Python支持多继承。例如一个子类,可以继承多个父类。就像人类,你可以同时继承父亲和母亲的基因。一个子类同时继承两个父类,其中的方法相同时的解析顺序

class F_Person:

def age(self):

print('这个是父亲的年龄')

class M_Person:

def age(self):

print('这个是母亲的年龄')

class Children(M_Person,F_Person):

pass

real=Children()

real.age()

print('子类的执行顺序为:',Children.__mro__)#查看方法的解析顺序

由上图可见,先继承那个,程序会先解析那个父类

三、Python中的布尔类型可以和数字进行运算

由上图中,通过mro()方法可以看出:bool类继承int类,int类继承了object类

四、super()方法,可以调用父类的方法

class Avg_Score():# 平均成绩类

def __init__(self,num1,num2,num3):

self.num1=num1 #英语成绩

self.num2=num2 #语文成绩

self.num3=num3 #数学成绩

def num_avg(self): #计算机求平均数的方法

print((self.num3+self.num2+self.num1)/3) #返回平均成绩

class Rewrite_Avg_Score(Avg_Score):#继承父类

def __init__(self,num1,num2,num3,num4):

super().__init__(num1,num2,num3)

self.num4=num4

def num_avg(self):#重写父类的方法

super().num_avg()#调用父类的方法

print(self.num4)

avg=Rewrite_Avg_Score(60,50,90,69)

avg.num_avg()

结果如图:

五、多态就是“具有多种形态”它指的是“即便不知道一个变量所引用的对象到底是什么类型,仍然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态地决定调用哪个对象中的方法。

class Fruit():#水果类

def flavor(self):

print("水果很美味")

class Banana(Fruit):#香蕉类

def flavor(self):#重写flavor

print("香蕉很甜")

class Apple(Fruit):#苹果类

def flavor(self):#重写flavor

print("苹果脆甜")

class Noodles:#面条类

def flavor(self):

print("面条有营养")

def fun(q):

q.flavor()

fun(Fruit())#水果类

fun(Banana())#香蕉类

fun(Apple())#苹果类

fun(Noodles())#面条类

动态语言不关心对象的类型,只关心对象的行为,类型可以根据值来改变。

六、自定义类对象实列特殊方法

(一)用__add__()方法,可以实现两个自定义类对象的实例对象之间的相加操作

class Add:

def __add__(self,other):#用add方法实现两个类对象的相加

return self.name+other.name

def __init__(self,name):

self.name=name

#创建了两个自定义类的对象

a1=Add(1)

a2=Add(3)

print(a1+a2) #当使用+时,会自动调用类对象中的特殊方法__add__()

(二)用__len__()方法,可以实现计算自定义对象的长度

class Add:

def __add__(self,other):#用add方法实现两个类对象的相加

return self.name+'和'+other.name

def __init__(self,name):

self.name=name

def __len__(self):#用len方法计算类对象的长度

return len(self.name)

#创建了两个自定义类的对象

a1=Add('张三')

a2=Add('李四')

print(len(a1+a2))#当重写了系统中的方法后,就可以进行计算类对象的长度。否则注释掉后不能够实现计算类对象的长度

七、对象的引用计数,如何知道对象有没有被使用,通过跟踪计数的方式进行确定。

(一)对象引用加1的情况

()class Add:

pass

a=Add() #第一种情况:对象赋值给变量,引用加1

c=a #第二种情况:引用对象的变量赋值给另一个变量,加1

list=[6,8,a] #第三种情况:对象作列表中的元素,加1

import sys

#使用sys.getrefcount()函数查看引用次数,使用该方法查看时会被引用一次

print(sys.getrefcount(a))#第四中情况:对象作为函数调用时的实参。调用该方法时,输出的结果为4,说明第一个创建MyClass()的实例对象有4个引用

print(sys.getrefcount(Add())) #输出结果为1 ,对象作为方法的参数传入引用计数加1,执行完毕,引用计数减1

(二)•对象引用减1的情况。

import sys

class Add:

pass

print(sys.getrefcount(Add()))#情况一,对象离开它的作用域,例如:对象所在的函数执行完毕

a=Add() #对象赋值给变量,引用加1

c=a #引用对象的变量赋值给另一个变量,加1

print(sys.getrefcount(a))#对象的引用为3

del c #情况二:对象的引用被显示销毁,c=a被销毁,所以减1

print(sys.getrefcount(a))#对象的引用为2,说明减1

list=[6,8,a] #对象作列表中的元素,加1

print(sys.getrefcount(a))#对象的引用为3

list=[6,8]#情况三:从容器中删除对象,或对象所在的容器被销毁

print(sys.getrefcount(a))#对象的引用为2,说明减1

当对象的应用机制减到零的时候,就等待垃圾回收机制进行回收。

以上分析了属性的取值和赋值方法;并通过实例分析了多继承的执行顺序;多态;特殊方法:__add__()和__len__()方法的重写实现类对象的相加和计算长度;对象的引用计数:加减情况。

python完全支持面向对象编程思想_面向对象的编程思想和Python的继承和多态,特殊方法,引用计数...相关推荐

  1. Java编程题_面向对象和常用API01_B级

    Java编程题_面向对象和常用API01_B级 第1题 面向对象.异常.集合.IO 题干: 请编写程序,完成键盘录入学生信息,并计算总分将学生信息与总分一同写入文本文件 需求:键盘录入3个学生信息(姓 ...

  2. [Linux驱动之路] 驱动设计的思想_面向对象_分层_分离—程序扩展

    韦东山老师的Linux驱动设计基础课程的p128 5_101 驱动设计的思想_面向对象_分层_分离这课在开发板上实作练习,可控制imx6ull_pro板子的LED开关. 基于韦老师代码的基础上,更改如 ...

  3. java基础2:this、static、final、abstract关键字、代码块、生成API工具包、继承、多态、方法重载和重写,抽象类、接口、常见异常、java权限修饰符、选择排序思想和程序和内部类

    1.this关键字 this表示当前类对象的地址空间值的引用.就是说,this代表了new出来的对象 其最大作用就是解决了构造器中局部变量隐藏成员变量.即用this.变量名 = 变量名 区分. 2.s ...

  4. python标准库很丰富支持多种编程范式_基础班-第03天{python基础}

    声明:内容来源于网络,本人只是在此稍作整理,如有涉及版权问题,归传智播客官方所有. 认识python(了解) 1.Python发展历史 起源 Python的作者,Guido von Rossum,荷兰 ...

  5. python是一种面向对象的高级语言_为什么入门大数据选择Python而不是Java?

    马云说:"未来最大的资源就是数据,不参与大数据十年后一定会后悔."毕竟出自wuli马大大之口,今年二月份我开始了学习大数据的道路,直到现在对大数据的学习脉络和方法也渐渐清晰.今天我 ...

  6. python支持函数式编程吗_利用Fn.py库在Python中进行函数式编程

    尽管Python事实上并不是一门纯函数式编程语言,但它本身是一门多范型语言,并给了你足够的自由利用函数式编程的便利.函数式风格有着各种理论与实际上的好处(你可以在Python的文档中找到这个列表): ...

  7. 支持所有库的python手机编程软件_有了这个软件,Python新手可以随时随地用手机练习编程了...

    很多小伙伴想利用空闲时间学习Python,但是有时候身边没有电脑,今天就给大家推荐一款手机APP:QPython. Qpython是一个Python引擎,只能运行在安卓系统上,内置了一个Python编 ...

  8. java面向对象的理解_面向对象及其核心的概念:抽象、继承与多态、封装

    面向对象的思想是上个世界60年代出现的,一些比较典型的面向对象的编程语言包括JAVA.C++等.很多脚本语言也支持面向对象的语法比如PHP.Python. 什么是面向对象呢?它是一种现实对象的建模方法 ...

  9. python语言支持苹果系统吗_Mac系统上的一款Python编程平台

    原标题:Mac系统上的一款Python编程平台 Python for Mac是Mac系统上的一款Python编程平台,由IDLE与Python Launcher两部分组成.Python支持多种编程技术 ...

最新文章

  1. 云栖社区 正文 永久免费SSL安全证书Letsencrypt安装使用方法
  2. Qt嵌入外部EXE程序,并显示在主界面中!
  3. EMOS 1.5安装和配置
  4. [Python图像处理] 八.图像腐蚀与图像膨胀
  5. 汇编工具安装三:已经配置好的汇编开发工具!
  6. LOJ #6052. 「雅礼集训 2017 Day11」DIV
  7. [转]IIS7全新管理工具AppCmd.exe的命令使用
  8. android 充电模式deamon_Android MarsDaemon实现进程及Service常驻
  9. Dedecms之SQL语句修改和调用数据总结
  10. cc=arm-linux,针对基于嵌入式ARM的Linux系统的交叉编译
  11. html语言制作静态网页,html+css制作的漂亮静态网页
  12. mac桌面与屏膜保护程序卡死完美解决方法
  13. java3d Intellij suddenly throwing ClassNotFoundException
  14. LED设备驱动开发实验—源码代码详解
  15. 腾讯面试题, 2020年,让我们愉快的赛一次马!
  16. 什么是溢出?补码加法运算如何判断是否溢出?
  17. DQN玩Atari游戏安装atari环境bug指南
  18. 钉钉开放平台查询宜搭表单实例数据
  19. 编程语言的心智负担!你学编程得有多大的压力快来测试一下~
  20. 基于SmartThreadPool线程池技术实现多任务批量处理

热门文章

  1. 解决长email在表格td中不自动换行的问题 CSS强制不换行
  2. 新词新意—The Sticks 乡下
  3. C++中链表的一些操作
  4. [Node.js] node.js入门
  5. 【Vue实例四】利用Vue组件实现添加评论的功能
  6. 地铁 java_怎么用Java编写一个地铁售票机的程序?
  7. 统计MOOC证书 (15 分)
  8. IDEA社区版找不到tomcat
  9. 定位模块介绍及使用(GPS、北斗、GLONASS、伽利略、准天顶)
  10. spring boot—自定义logback日志配置