python中类的设计问题(一些高级问题探讨,函数重载,伪私有,工厂模式,类方法等)
从这里再次体现了python语言强大的灵活性。某些在高级语言中看似不严谨需要尽量避免的地方在python中都是允许的。
比如:
(1),异常可以用来处理错误
(2),方法,类也都可以视为对象。
(3),没有任何的类型声明
可见,python中一切皆为对象,包括类,而类在C++,java中仅仅是编译器的输入而已。
1,函数重载
python因为没有类型声明,因此函数重载不能通过参数类型标记来实现。python中的多台是基于对象接口的,而不是类型。
2,伪私有
python的伪私有属性:所谓伪私有,是指这么做仅仅避免了实例内的命名空间冲突,而不是限制变量名的读取
具体做法是,class语句内部有两个下划线,但是结尾没有两个下划线的变量名或者函数名,会自动扩张,从而包含了所在类的名称。比如:spam类中的__x这样的变量会自动变为_spam__x;
3,绑定或者无绑定方法
类进行点号运算得到无绑定方法,该方法对象必须传入明确的实例对象。
对象进行点号运算得到绑定方法,可以直接传入参数进行调用
class T:
def x(self):
print('test') if __name__=='__main__':
a=T()
#print(dir(T))
#print(T.__dict__.keys())
y=a.x
y(); z=T.x
z(y)
不过在3.0中,无绑定方法也不强制传入实例对象了
多重继承:
和c++、java等高级语言都不同
python可以进行多重继承,搜索属性时,pthon会从左到右搜索类首行中的超类,知道找到相符者。
对于这一点,书上有一个很有用的打印类所有属性(包括从超类中继承的属性的方法),详见课本p768
python实现工厂设计模式
因为类也是对象,因此利用python实现工厂设计模式非常简单
def factory(aClass,*args):
return aClass(*args)
第一个参数传入类名称,其他参数为类构造函数的参数即可
函数装饰器,类方法和静态方法
在python3.0中方法可以直接通过类名调用,视作不绑定方法,这就类似于了类方法。但是此时不能使用实例调用,因为默认实例将作为方法的第一个参数,而这样编写的类方法中没有参数可以接受
对应的方式使用@staticmethod进行修饰,这样通过类和实例都可以进行调用。
关于类装饰器和元类木有看懂,不过这些高级功能应当是对于工具编写者有用,对于程序员就没那么重要。
python中类的设计问题(一些高级问题探讨,函数重载,伪私有,工厂模式,类方法等)的更多相关文章
- 简学Python第七章__class面向对象高级用法与反射
Python第七章__class面向对象高级用法与反射 欢迎加入Linux_Python学习群 群号:478616847 目录: Python中关于oop的常用术语 类的特殊方法 元类 反射 一.P ...
- python面向对象编程设计与开发
一.什么是面向对象的程序设计 1.何为数据结构? 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合,如列表.字典. 2.何为编程? 编程是指程序员用特定的语法+数据结构+算法,组成的代码,告 ...
- 第7.6节 Python中类的继承机制详述
在本章第一节,介绍了面向对象程序设计的三个特征:封装.继承和多态,前面章节重点介绍了封装和多态,由于Python语言是多态语言,对象的类型不再由继承等方式决定,而由实际运行时所表现出的具体行为来决定, ...
- python中类的继承
python中类的继承 在python中面向对象编程中实现继承,以下面一个实例进行说明. class SchoolMenber(): # __init__类似于c++中的构造函数 # __init__ ...
- Python中类的__init__继承
Python中类的__init__继承 概念: 定义父类 In [10]: class Person: ....: def __init__(self,name,age,sex): ....: sel ...
- python中类中属性和方法的具体定义方法和使用
1. Python中类中特性分成属性和方法 属性和方法都分为私有和公有的,私有的只可以在本类中使用外部是无法访问的 2. 定义属性(成员变量)的语法格式(公有属性/私有属性) class 类名: de ...
- Python中类的属性的访问控制
因为自己是做.NET的,之前有学习过Python,喜欢这门语言的很多特性,最近又不时看了一会儿,将自己的感受分享给大家,其中也难免会用C#的角度看Python的语法,主要还是讲下Python中类中对属 ...
- python中类的定义、实例化、封装以及私有变量/方法
1. 定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 ...
- 《一头扎进》系列之Python+Selenium框架设计篇3- 价值好几K的框架,狼来了,狼来了....,狼没来,框架真的来了
1. 简介 前边宏哥一边一边的喊框架,就如同一边一边的喊狼来了!狼来了!.....这回是狼没有来,框架真的来了.从本文开始宏哥将会一步一步介绍,如何从无到有地创建自己的第一个自动化测试框架.这一篇,我 ...
随机推荐
- Java编程思想读书笔记 第一章 对象导论
抽象过程 纯粹的面向对象程序设计方式: 万物皆为对象: 对象可以存储数据,还可以在其自身执行操作 程序是对象的集合: 通过发送消息告诉彼此要做的 每个对象都有自己的由其它对象构成的存储:可以在程序中构 ...
- RabbitMQ入门教程(十三):虚拟主机vhost与权限管理
原文:RabbitMQ入门教程(十三):虚拟主机vhost与权限管理 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...
- centos安装mysql以及授权登录用户
CentOS第一次安装MySQL的完整步骤 目录 1.官方安装文档 2.下载 Mysql yum包 3.安转软件源 4.安装mysql服务端 5.首先启动mysql ...
- 手把手教你上传文件到GitHub上(已获取ssh密钥)
如何提交一个文件到GitHub(已经生成ssh key) 1.新建一个文件夹,当作本地仓库 2.初始化仓库 $git init 3.将想要上传的东西复制到仓库中 4.将文件提交到暂存区 $git ad ...
- MySQL第三讲 一一一一 视图、触发器、函数、存储过程
1. 视图 1.1 视图前戏 我们之前讲有,临时表的概念. 现在我们创建一个临时表:select * from (select * from tb1 where id between 10 and 1 ...
- 使用 dataset 管理数据(官网)
ECharts 4 开始支持了 dataset 组件用于单独的数据集声明,从而数据可以单独管理,被多个组件复用,并且可以基于数据指定数据到视觉的映射.这在不少场景下能带来使用上的方便. ECharts ...
- s:schema报错问题
解决方案: 删除所有<s:element ref="s:schema"/>标签 说明书改为本地文件
- 012-zabbix主动模式
6.1 主动模式 zabbix agent检测分为主动(agent active)和被动(agent)两种形式,主动与被动的说法均是相对于agent来讨论的.简单说明一下主动与被动的区别如下: 主动: ...
- linux下mysql5.7的MHA高可用架构搭建
一.MHA简介 MHA(Master High Availability)目前在mysql高可用方面比较成熟.是一套优秀的作为 mysql高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障 ...
- 再谈变分自编码器VAE:从贝叶斯观点出发
链接:https://kexue.fm/archives/5343