方法

类方法@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)类__方法与继承的更多相关文章

  1. 全面了解python中的类,对象,方法,属性

    全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  2. Python科普系列——类与方法(下篇)

    书接上回,继续来讲讲关于类及其方法的一些冷知识和烫知识.本篇将重点讲讲类中的另一个重要元素--方法,也和上篇一样用各种神奇的例子,从原理和机制的角度为你还原一个不一样的Python.在阅读本篇之前,推 ...

  3. Python类,域,方法,对象,继承

    类和对象: 是面向对象编程的两个主要方面,类创建一个新类型,而对象这个类的实例.. 域: 属于一个对象或类的变量被称为域.域有两种类型: 属于每个实例(类的对象)或属于类本身.它们分别被称为实例变量和 ...

  4. Python面向对象编程-类的封装,继承、多态

    面向对象是一种程序设计思想,对象作为程序基本单元,包含了数据和操作数据的函数. 面向对象的三大特点--数据封装.多态和继承. #类的创建,class关键字,类名大写,object表示从哪个类继承而来, ...

  5. 小甲鱼Python笔记(类)

    类和对象 类的构造方法 def __init__(): 1 class People: 2 def __init__(self,name): 3 self.name = name 注意:在构造方法中的 ...

  6. Python科普系列——类与方法(上篇)

    欢迎来到新的系列,up又开新坑了~~ 实际上,Python作为一门易用性见长的语言,看上去简单,却仍然有很多值得一说的内容,因此这个系列会把Python中比较有意思的地方也给科普一遍.而另一方面,关于 ...

  7. Python中的类、对象、继承

    类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...

  8. NO.7:自学python之路------类的方法、异常处理、socket网络编程

    引言 我visual studio 2017就算体积巨大.启动巨慢.功能简陋也不会安装PyCharm的,嘿呀,真香.好吧,为了实现socket网络编程,更换了软件. 正文 静态方法 只是在名义上归类管 ...

  9. Python学习笔记008_类_对象_继承_组合_类相关的BIF

    # 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...

随机推荐

  1. AutoLayout(自动布局)

    1. iOS两种自适应布局方式:(修正说明:) -AutoLayout(自动布局) + SizeClasses(尺寸类别) -Autoresizing (自动调整尺寸/弹簧式调整尺寸) 前者 Auto ...

  2. 带交互的 iOS 产品原型可以用什么软件制作?

    摘自知乎http://www.zhihu.com/question/20326729 来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 首先如果你小团队或者个人开发,当然 ...

  3. 最新版Android开发工具

    最新版Android开发工具 JUN 27TH, 2014 Android Tools ADT Bundle ADT Bundle包含了Eclipse.ADT插件和SDK Tools,是已经集成好的I ...

  4. Cannot create an instance of OLE DB provider "OraOLEDB.Oracle" for linked server "xxxxxxx".

    在SQL SERVER 2008 R2下用Windows 身份认证的登录名创建了一个访问ORACLE数据库的链接服务器xxxxx,测试成功,木有问题,但是其它登录名使用该链接服务器时,报如下错误: 消 ...

  5. 《java JDK7 学习笔记》之Collection

    一.使用Collection 收集对象 1.认识Collection架构 Java SE提供了满足各种需求的API,在使用这些API前,建议先了解其继承与接口操作架构,才能了解何时使用哪个类,以及类之 ...

  6. 把Tomcat注册为windows服务

    配置环境变量 JAVA_HOME=D:\java CLASSPATH=.;%JAVA_HOME%\lib; PATH=%JAVA_HOME%\bin; 提示:一般jre默认在jdk目录下%JAVA_H ...

  7. PostgreSQL-PL/pgSQL

    参考: https://wiki.postgresql.org/wiki/9.1%E7%AC%AC%E4%B8%89%E5%8D%81%E4%B9%9D%E7%AB%A0 摘记: PL/pgSQL是 ...

  8. Blog List

    Blog List Spark Spark官方文档 - 中文翻译 Spark快速入门 - Spark 1.6.0 Spark SQL 官方文档-中文翻译 Spark SQL 之 Migration G ...

  9. eclipse中去除build时总是js错误的问题

    在用eclipse时经常莫名其名的弹出如下框框,有的时候甚至还死循环了.严重影响开发效率. 原因分析就是我们项目的一些js代码,eclipse验证时有错误的,其实是没有错误的.不知道eclipse是怎 ...

  10. TFS 升级错误一则 TF400654

    升级后报 [错误] TF400654: 无法配置规划工具.以下元素包含错误: BugWorkItems/BugWorkItems.TF400506: 此元素将定义表示 Bug 或缺陷的工作项的状态.每 ...