1、 类中的方法

在类里主要有三种方法:

a、普通方法:在普通方法定义的时候,需要一个对象的实例参数,从而在类中定义普通方法的时候,都必须传送一个参数self,那么这个参数也就是object

b、类方法:在类方法中,传递的参数为类也就是class,在一般使用中参数为cls

c、静态方法:无需任何参数,在静态方法中,仅仅是一个函数,在调用静态方法的时候,不需要传递任何参数即可使用

在类的三种方法中,普通方法和类方法都是绑定的方法,也就是在其中需要传递参数,普通方法传递为slef,类方法传递的为cls

在使用的时候,静态方法仅仅是逻辑上和class绑定在一起的,而类方法可以做动态的匹配,传递进去的是clas,也就是类

在语法上,静态方法需要使用装饰符@staticmethod,而类方法需要使用装饰符@classmethod

使用模块函数比使用静态方法更加常见。

#!/usr/bin/env python

class TestMethod(object):
def foo(self,x): #定义类中的普通函数,传递参数为self,也就是类的实例
print 'excuting foo(%s,%s)' % (self,x)
@staticmethod #定义静态方法,在其中不传递参数
def static_foo(x):
print 'excuting static_foo(%s)' % x
@classmethod #传递类方法,在其中传递的参数为cls
def class_foo(cls,x):
print 'excuting class_foo(%s,%s)' % (cls,x) kel = TestMethod()
kel.foo(1)
kel.static_foo(1)
kel.class_foo(1)
TestMethod.static_foo(1)
TestMethod.class_foo(1)
print (kel.foo)
print (kel.static_foo)
print (kel.class_foo)

执行结果如下:

[root@python 422]# python testMethod.py
excuting foo(<__main__.TestMethod object at 0x7f41f884c050>,1) #参数为绑定的实例,也就是object
excuting static_foo(1) #静态方法没有其他参数
excuting class_foo(<class '__main__.TestMethod'>,1) #类方法使用的参数是类
excuting static_foo(1)
excuting class_foo(<class '__main__.TestMethod'>,1)
<bound method TestMethod.foo of <__main__.TestMethod object at 0x7f41f884c050>> #普通方法是绑定方法,使用的参数为self
<function static_foo at 0x7f41f884a0c8>
<bound method type.class_foo of <class '__main__.TestMethod'>> # 类方法也是绑定方法,使用的参数为cls

2、 类的特殊的属性

类中具有几种特殊属性,如下所示:

__name__,表示类的名字

__doc__,类的文档字符串

__bases__,类的所有父类构成的元组

__dict__,类的属性

__module__,类所在的模块

__class__,类多对用的类

在使用类的方法__init__方法中,此方法应该返回为None:

#!/usr/bin/env python

class Kel(object):
def __init__(self):
print 'this is the init method called'
return 1 kel = Kel()

在如上的代码中,在init方法中,返回了一个值为1

执行结果如下:

[root@python 422]# python testinitRetun.py
this is the init method called
Traceback (most recent call last):
File "testinitRetun.py", line 8, in <module>
kel = Kel()
TypeError: __init__() should return None, not 'int'

也就是在init方法中,必须返回值为None。

3、 关于方法__init__

#!/usr/bin/env python

class Kel(object): #父类方法
def __init__(self):
print 'Kel class called'
class J(Kel):#J是继承Kel类
def __init__(self): #重写了init方法
print 'J class is called'
class M(Kel):#M继承Kel类
def __init__(self):#重写了init方法
super(M,self).__init__()#调用了父类的方法
print 'M class is called'
print '-'*10
kel = Kel()
print '-'*10
j = J()
print '-'*10
m = M()

执行结果如下:

[root@python 422]# python testinitRetun.py
----------
Kel class called
----------
J class is called
----------
Kel class called
M class is called

可以看到,如果子类写了自己的init方法,那么不会自动的调用父类的init方法,必须在子类的init方法中自己进行调用,如上子类M所示

每个子类最好构造自己的构造器,不然积累的构造器会被调用,然而,如果子类重写基类的构造器,基类的构造器就不会被自动调用了。

a、 基类的构造器就必须显式的写出来才会被执行

b、 传递self的实例对象给基类进行调用,在上面的例子中,使用的是内建方法super,最好是使用super方法

在使用super调用基类方法的时候,找到基类方法,并且传入self参数即可,不需要明确指定父类的名字,并且在修改的时候,也是容易修改的。

4、 类的使用

一个类被定义后,目标就是要把它当成一个模块来使用,并把对象嵌入到代码中,同其他数据类型及逻辑执行流混合使用。

使用类的方式有两种,一种是组合,一种是派生

#!/usr/bin/env python
class Phone(object):
def __init__(self,ph):
self.phone = ph class Person(object):
def __init__(self,nm,ph):
self.name = nm
self.phone = Phone(ph) p = Person('kel','1234143')
print p.name,p.phone.phone

如上代码所示,使用的是组合的方式,在类Phone中,表示手机号码,而在类Person中包含了一个phone对象,那么就表示person has-a phone,类与类之间的关系为has-a的关系,在一个类中包含其他类的实例,就表示为组合。

class Person(object):
def __init__(self,nm,ph):
self.name = nm
self.phone = Phone(ph) class Kel(Person):
def shout(self):
pass

如上的代码中Kel继承了person类,从而表示为类与类之间的关系为派生关系,也就是表示:相同的类具有一些不同的功能,从而可以写出自己的方法。

一个子类可以继承它的基类的任何属性,不关是数据属性还是方法。

在继承中可以覆盖父类的方法,——直接使用同名的函数即可进行覆盖,也就是所谓的override方法

python中类的总结的更多相关文章

  1. python中类的继承

    python中类的继承 在python中面向对象编程中实现继承,以下面一个实例进行说明. class SchoolMenber(): # __init__类似于c++中的构造函数 # __init__ ...

  2. Python中类的__init__继承

    Python中类的__init__继承 概念: 定义父类 In [10]: class Person: ....: def __init__(self,name,age,sex): ....: sel ...

  3. python中类中属性和方法的具体定义方法和使用

    1. Python中类中特性分成属性和方法 属性和方法都分为私有和公有的,私有的只可以在本类中使用外部是无法访问的 2. 定义属性(成员变量)的语法格式(公有属性/私有属性) class 类名: de ...

  4. Python中类的属性的访问控制

    因为自己是做.NET的,之前有学习过Python,喜欢这门语言的很多特性,最近又不时看了一会儿,将自己的感受分享给大家,其中也难免会用C#的角度看Python的语法,主要还是讲下Python中类中对属 ...

  5. python中类的定义、实例化、封装以及私有变量/方法

    1.  定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 ...

  6. Python中类的继承代码实例

    Python中类的继承代码实例 这篇文章主要介绍了Python中类的继承代码实例,本文直接给出代码及运行效果,需要的朋友可以参考下 相对于C 的继承编写,Python更简洁,而且效率也是很高的,下面编 ...

  7. 第7.6节 Python中类的继承机制详述

    在本章第一节,介绍了面向对象程序设计的三个特征:封装.继承和多态,前面章节重点介绍了封装和多态,由于Python语言是多态语言,对象的类型不再由继承等方式决定,而由实际运行时所表现出的具体行为来决定, ...

  8. Python中类的相关介绍

    本文主要介绍python中类的概念性内容,如类的定义.说明及简单使用 1. 类的简单介绍 1 # -*- coding:utf-8 -*- 2 # Author:Wong Du 3 4 ''' 5 - ...

  9. Python中类的特殊方法详解

    本文和大家分享的主要是python语言中类的特殊方法相关用法,希望对大家有帮助. 构造序列 1._len_(self) 2._getitem_(self,key) 3._setitem_(self,k ...

  10. python中类的属性(class attribute)的解释

    python中的类叫 class object,类的实例叫instance object. 类 Class Objects 类拥有两种操作,1.类属性 attribute references 2.实 ...

随机推荐

  1. js获取滚动条距离浏览器顶部,底部的高度,兼容ie和firefox

    做web开发经常会碰到需要获取浏览器的滚动条与顶部和底部的距离,然后做相应的处理动作.下面作者就如何通过js来获取浏览器滚动条距离浏览器顶部和底部的高度做一下分享,这个是同时兼容ie和firefox的 ...

  2. Linux下 执行程序

    看到有人问Linux下的./表示什么意思,我就趁机在这里写一下个人愚见: ./的意思是执行当前目录下的某可执行文件. . /相当于 source 根目录下的一个脚本.

  3. Spring boot 整合jsp和tiles模板

    首先贴上我的pox.xml文件,有详细的支持注释说明 <?xml version="1.0" encoding="UTF-8"?> <proj ...

  4. 《Linux/Unix系统编程手册》读书笔记5

    <Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...

  5. [原]最短路专题【基础篇】(updating...)

    hud1548 a strange lift  最短路/bfs  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:一个奇怪的电梯,每层楼的 ...

  6. POJ 2114 - Boatherds

    原题地址:http://poj.org/problem?id=2114 题目大意: 给定一棵点数为\(n~(n \le 10000)\)的无根树,路径上有权值,给出m组询问($m \le 100$), ...

  7. dotnet il editor 调试 iis 程序

    没有C#源代码,IL级别调试.听说windbg也可以,不过windbg有些难.另外il其实一般写C#程序也不熟,不过我目的只是找出异常点,到客户一般不发pdb文件,出去也是release版本,出异常( ...

  8. POJ 3565 Ants (最小权匹配)

    题意 给出一些蚂蚁的点,给出一些树的点,两两对应,使他们的连线不相交,输出一种方案. 思路 一开始没想到怎么用最小权匹配--后来发现是因为最小权匹配的方案一定不相交(三角形两边之和大于第三边)--还是 ...

  9. 如何添加真机调试的iOS设备

    注意点: 有时需要同意协议什么的,很多时候刷新出来都是白屏,解决办法: 对于不能确认新协议的问题,我发现了一个解决方法:登陆后,直接在浏览器的地址框访问:https://developer.apple ...

  10. mysql利用存储过程批量插入数据

    最近需要测试一下mysql单表数据达到1000W条以上时增删改查的性能.由于没有现成的数据,因此自己构造,本文只是实例,以及简单的介绍. 首先当然是建表: [sql]view plaincopy CR ...