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. 简介 前边宏哥一边一边的喊框架,就如同一边一边的喊狼来了!狼来了!.....这回是狼没有来,框架真的来了.从本文开始宏哥将会一步一步介绍,如何从无到有地创建自己的第一个自动化测试框架.这一篇,我 ...
随机推荐
- L2-001. 紧急救援(迪杰斯特拉算法)
L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...
- Longest Subsequence CodeForces - 632D (lcm)
大意: 给定序列$a$, 求选出最长的一个子序列, 使得lcm不超过m. 刚开始想复杂了, 想着枚举gcd然后背包, 这样复杂度就是$O(\sum\limits_{i=1}^m \frac{m\sig ...
- git使用以及对应sourceTree
git上面的几条指令 (1)要想把A合并到B分支上,就需要先切换到B分支上,然后在合并A分支,执行指令: git checkout B // 这是切换到B分支上 git merge A // 这是将A ...
- 一个常用的通过curl发送HTTP请求的函数
function: function curl_get($url, $params) { return curl_http($url, $params, 'GET'); } function curl ...
- 关于strcpy的安全函数的选择
1)如果整个程序,在进行字符拷贝时,这个拷贝字符串的完整性,不影响整个程 序的运行,可以让其截取一部分字符串,程序继续执行.那么我们就可以选择安全 函数:strncpy_s 2)如果在进行字符串拷贝时 ...
- js 向数组对象中添加属性和属性值
let resultList = [{"name":"a1"},{"name":"b1"}] resultList.fo ...
- python cv2展示网络图片、图片编解码、及与base64转换
从网络读取图像数据并展示 需要使用cv2.imdecode()函数,从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式:主要用于从网络传输数据中恢复出图像. # -*- coding: utf ...
- CentOS7 yum安装配置 +redis主从配置
一.安装必要包 yum install gcc 二.linux下安装 #下载 wget http://download.redis.io/releases/redis-3.0.0.tar.gz tar ...
- python程序超时处理 timeout_decorator
如下两个例子,实现对某个函数的超时处理(其实就是加了一个装饰器timeout): 成功例子: 代码: import time import timeout_decorator @timeout_dec ...
- Delphi 变量