Python笔记(5)类__方法与继承
方法
类方法@classmethod,实例方法,静态方法@staticmethod,特殊方法,__init__
形式上的区别:调用是通过类和实例进行,不能直接调用,有自己的特殊参数,如__init__有self,类方法有参数class,有自己的声明方式。
实质上的区别:类方法与类绑定,实例方法绑定实例,静态方法无绑定(和函数一样,只不过用类和实例进行调用),特殊方法某些场景会自动调用。
特殊方法

数字计算:加减乘除都是通过特殊方法来实现的,round是四舍五入。
调用方法:str()转化成字符串,len()长度,bool判断真假。
比较大小:lt是less than,le是less equal,gt是great than,ge是great equal,ne是not equal。
集合访问:setslice,getslice是切片操作,getitem,setitem是字典的item访问,contains是包含(就是if a in b)的时候用。
迭代器,属性访问,类生产,前面有说过了。
class Point(object):
def __init__(self,x,y):
self.x = float(x)
self.y = float(y)
def __sub__(self, other):
assert isinstance(other,Point)
return Point(self.x-other.x,self.y-other.y)
def __add__(self, other):
assert isinstance(other,Point)
return Point(self.x+other.x,self.y+other.y)
def __mul__(self,factor):
return Point(self.x*factor, self.y*factor)
def __div__(self,factor):
return Point(self.x/factor, self.y/factor) @property
def xy(self):
return (self.x,self.y) def __str__(self):
return "x={0},y={1}".format(self.x,self.y)
def __repr__(self):
return str(self.xy) if __name__ == '__main__': a = Point(50,60)
b = Point(30,40) print a-b
print a+b
print a*2
print a/2
a
Out[5]: (50.0, 60.0) print a
x=50.0,y=60.0
这里重载了加减乘除。python中运算符重载很方便,只要你重新写一下特殊方法。
__str__是当你调用print的时候他会自动调用__str__。
__repr__是给计算机看的,比如你输入a 他应该输出地址什么的,但是因为这里重写了repr所以他会输出我们想要的(self.x,self.y)。
继承
通过已有的类,生产新的类,新的类具有父类的属性和方法,实现代码的重用。
单一继承比较简单,就是直接继承属性和方法。
继承顺序
MRO method resolution order 方法的解析顺序。
继承顺序,经典类是深度优先,新式类是C3算法。
经典类A是优先于C的,新式类C优先于A。
class A:
a=1
b=1 class B(A):
a=2 class C(A):
a=3
b=3
c=3 class D(B,C):
pass if __name__=="__main__":
d=D()
import inspect inspect.getmro(D)
Out[15]:
(<class __main__.D at 0x07A14148>,
<class __main__.B at 0x07A140D8>,
<class __main__.A at 0x07A140A0>,
<class __main__.C at 0x07A14110>)
d.a
Out[17]: 2 d.b
Out[18]: 1 d.c
Out[19]: 3
d的a属性继承自B,b属性继承自A,c属性继承自C,如果A中已经定义了c,则C对于c属性的重写则永远都不会访问到。新式类曾经有一段时间使用深度优先,这样解决了无法访问重写的问题,但是他违背了查找的顺序性。
新式类:
class A(object):
a=1
b=1
#只要修改A(object)就好了,其他不变。
inspect.getmro(D)
Out[22]: (__main__.D, __main__.B, __main__.C, __main__.A, object)
print d.a,d.b,d.c
2 3 3
这里a属性继承自B,bc属性继承自C。并且新式类D中有mro的特殊方法,经典类没有。
D.__mro__
Out[26]: (__main__.D, __main__.B, __main__.C, __main__.A, object)
C3算法,用的是一个拓扑排序并且为了顺序性,拓扑排序的时候出现两个入度为0则取左边的。可以参考http://python.jobbole.com/85685/。
方法调用
class A:
def test(self):
print "A's test" class B(A):
def test(self):
print "B's test"
A.test(self)
class C(A):
def test(self):
print "C's test"
A.test(self) class D(B,C):
def test(self):
print "D's test"
B.test(self)
C.test(self) if __name__=="__main__":
a=D()
a.test()
D's test
B's test
A's test
C's test
A's test
为了避免父类函数被重复调用,所以有了Super。
Super是一个类,不是函数。Super只在新式类里有。super(instance,self)。
class A(object):
def test(self):
print "A's test" class B(A):
def test(self):
print "B's test"
super(B,self).test() class C(A):
def test(self):
print "C's test"
super(C,self).test() class D(B,C):
def test(self):
print "D's test"
super(D,self).test() if __name__=="__main__":
a=D()
a.test()
D's test
B's test
C's test
A's test
#只出现一次,广度优先。
多态
多态是不同类的相同方法,相同参数,不同的功能。不同的参数是重载(args,kwargs)。
Python中并不需要像java那样写好接口,规定什么属性,python是一种动态语言,参数在传入之前是无法确定参数类型的。所以python会假设存在,然后直接调用,如果没有就会报错。可以参考http://blog.csdn.net/shangzhihaohao/article/details/7065675。
Python是动态强类型语言。
Python笔记(5)类__方法与继承的更多相关文章
- 全面了解python中的类,对象,方法,属性
全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...
- Python科普系列——类与方法(下篇)
书接上回,继续来讲讲关于类及其方法的一些冷知识和烫知识.本篇将重点讲讲类中的另一个重要元素--方法,也和上篇一样用各种神奇的例子,从原理和机制的角度为你还原一个不一样的Python.在阅读本篇之前,推 ...
- Python类,域,方法,对象,继承
类和对象: 是面向对象编程的两个主要方面,类创建一个新类型,而对象这个类的实例.. 域: 属于一个对象或类的变量被称为域.域有两种类型: 属于每个实例(类的对象)或属于类本身.它们分别被称为实例变量和 ...
- Python面向对象编程-类的封装,继承、多态
面向对象是一种程序设计思想,对象作为程序基本单元,包含了数据和操作数据的函数. 面向对象的三大特点--数据封装.多态和继承. #类的创建,class关键字,类名大写,object表示从哪个类继承而来, ...
- 小甲鱼Python笔记(类)
类和对象 类的构造方法 def __init__(): 1 class People: 2 def __init__(self,name): 3 self.name = name 注意:在构造方法中的 ...
- Python科普系列——类与方法(上篇)
欢迎来到新的系列,up又开新坑了~~ 实际上,Python作为一门易用性见长的语言,看上去简单,却仍然有很多值得一说的内容,因此这个系列会把Python中比较有意思的地方也给科普一遍.而另一方面,关于 ...
- Python中的类、对象、继承
类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...
- NO.7:自学python之路------类的方法、异常处理、socket网络编程
引言 我visual studio 2017就算体积巨大.启动巨慢.功能简陋也不会安装PyCharm的,嘿呀,真香.好吧,为了实现socket网络编程,更换了软件. 正文 静态方法 只是在名义上归类管 ...
- Python学习笔记008_类_对象_继承_组合_类相关的BIF
# 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...
随机推荐
- 在 CentOS7 上部署 zookeeper 服务
在 CentOS7 上部署 zookeeper 服务 1 用 SecureCRT 或 XShell 等 Linux 客户端工具连接至 CentOS7 服务器: 2 进入到 /usr/local/too ...
- B样条曲线曲面(附代码)
1 B样条曲线 1.1 B样条曲线方程 B样条方法具有表示与设计自由型曲线曲面的强大功能,是形状数学描述的主流方法之一,另外B样条方法是目前工业产品几何定义国际标准——有理B样条方法 (NURBS)的 ...
- CLR简介(一)
什么是通用语言运行时(CLR),简单来讲: CLR是一个支持多种编程语言及多语言互操作,完整的高级虚拟机. 有点拗口,而且不是很有启发性,但上面的文字是将又大又复杂的CLR的功能归类以便容易理解的第一 ...
- 人工智能与3A
我在Tid2014上的一个小视频: 下一代的码农会是什么样的呢?且听咕咚老王的“3A”畅谈——“Ai.Art.Any”. 在艺术的视角下,世界是沉寂的.美丽的: 在码农的眼中,世界是有“码”的朦胧美吗 ...
- Linux命令学习总结:pwd命令
命令简介: 该命令用来显示目前所在的工作目录.指令英文原义:print work directory 执行权限 :All User 指令所在路径:/usr/bin/pwd 或 /bin/pwd ...
- TCP三次握手建立连接
基本过程: ISN(初始序号)随时间变化,每一个连接具有不同的ISN,防止在网络延迟中分组被重新发送. 请求端发送SYN(同步序号 )=1,seq=ISN(32bits序号,每4ms+ ...
- sshfs 实现普通用户可读写
先实现普通用户免密码host1可登入host2host1# yum install fuse sshfs; 如果装不上,需要安装epep源 --enablerepo=epelhost1# su - e ...
- 优化临时表使用,SQL语句性能提升100倍
[问题现象] 线上mysql数据库爆出一个慢查询,DBA观察发现,查询时服务器IO飙升,IO占用率达到100%, 执行时间长达7s左右.SQL语句如下:SELECT DISTINCT g.*, cp. ...
- ARM汇编与C混合编程
GNU内联汇编 内联汇编即在C中直接使用汇编语句进行编程,使程序可以在C程序中实现C语言不能完成的一些工作,例如,在下面几种情况中必须使用内联汇编或嵌入型汇编 程序中使用饱和算术运算(Saturati ...
- ipv4理论知识2-分类编址、ip分类、网络标识、主机标识、地址类、地址块
分类编址 ipv4的体系结构中有分类编址和无分类编址(后续会介绍到),在分类编址时,ipv4地址分为A.B.C.D.E这5类.每类占用的IP比例和个数如下图: ipv4分类识别 计算机以二进制方式存储 ...
