Python类的基础入门知识


Posted in Python onNovember 24, 2008
class Account(object): 
"一个简单的类" 
account_type="Basic" 
def __init__(self,name,balance): 
"初始化一个新的Account实例" 
self.name=name 
self.balance=balance 
def deposit(self,amt): 
"存款" 
self.balance=self.balance+amt 
def withdraw(self,amt): 
"取款" 
self.balance=self.balance-amt 
def inquiry(self): 
"返回当前余额" 
return self.balance

其中,__init__函数就是Python中的构造函数。另外,balance这个变量是类实例的变量。
另外,在python中类中定义成员函数一般第一个参数总是self,表示自已的实例,与C++中的this指针差不多,不过C++中的this指针是隐函于其中并全局可见的,而在Python中却要作为参数传进去, 这是Python中定义类的另一个特点。
还有一个特点,在类的成员函数中,使用类中的另一个成员函数,前面必须要指定类名,如下:
class Foo(object): 
def bar(self): 
print "bar!" 
def spam(self): 
bar(self) # 错误,引发NameError, 可以是:self.bar 
Foo.bar(self) # 合法的

2.在类中声时静态方法并使用静态方法
要在类中使用静态方法,需在类成员函数前面加上@staticmethod标记符,以表示下面的成员函数是静态函数。使用静态方法的好处是,不需要定义实例即可使用这个方法:另外,多个实例共享此静态方法,如下: 
class SimClass(): 
@staticmethod 
def ShareStr(): 
print "This is a static Method" 
SimClass.ShareStr() #使用静态函数

3.类方法:
类方法与普通的成员函数和静态函数有不同之处,在接触的语言中好像也没见过这种语义,看它的定义:
一个类方法就可以通过类或它的实例来调用的方法, 不管你是用类来调用这个方法还是类实例调用这个方法,该方法的第一个参数总是定义该方法的类对象。
记住:方法的第一个参数都是类对象而不是实例对象.
按照惯例,类方法的第一个形参被命名为 cls. 任何时候定义类方法都不是必须的(类方法能实现的功能都可以通过定义一个普通函数来实现,只要这个函数接受一个类对象做为参数就可以了).
定义类方法并使用类方法:
class ABase(object): 
@classmethod #类方法修饰符 
def aclassmet(cls): print 'a class method for', cls.__name__ 
class ADeriv(ABase): pass 
bInstance = ABase( ) 
dInstance = ADeriv( ) 
ABase.aclassmet( ) # prints: a class method for ABase 
bInstance.aclassmet( ) # prints: a class method for ABase 
ADeriv.aclassmet( ) # prints: a class method for ADeriv 
dInstance.aclassmet( ) # prints: a class method for ADeriv

也就是说,类方法并不是必须的,使用普通函数也可以实现类方法的功能。
4.类的继承
在python中,继承一个类,就像这样:
class A(object) #继承object类
#.......
class B(A) #继承A类
#........
另外,python中支持多继承,对于多继承,找某个对应的函数,其python有相应的方法,如: 
class D(oject): pass #D继承自object 
class B(D): #B是D的子类 
varB = 42 
def method1(self): 
print "Class B : method1" 
class C(D): #C也是D的子类 
varC = 37 
def method1(self): 
print "Class C : method1" 
def method2(self): 
print "Class C : method2" 
class A(B,C): #A是B和C的子类 
varA = 3.3 
def method3(self): 
print "Class A : method3"

如果我要调用A.method1() ,会出现什么结果?答案是ClassB:method1. 书上是只样介绍的:
当搜索在基类中定义的某个属性时,Python采用深度优先的原则、按照子类定义中的基类顺序进行搜索。**注意**(new-style类已经改变了这种行为)。上边例子中,如果访问 A.varB ,就会按照A-B-D-C-D这个顺序进行搜索,只要找到就停止搜索.若有多个基类定义同一属性的情况,则只使用第一个被找到属性值:
5.数据隐藏
在python中实现数据隐藏很简单,不需要在前面加什么关键字,只要把类变量名或成员函数前面加两个下划线即可实现数据隐藏的功能,这样,对于类的实例来说,其变量名和成员函数是不能使用的,对于其类的继承类来说,也是隐藏的,这样,其继承类可以定义其一模一样的变量名或成员函数名,而不会引起命名冲突。
class A: 
def __init__(self): 
self.__X = 3 # self._A__X 
class B(A): 
def __init__(self): 
A.__init__(self) 
self.__X = 37 # self._B__X
Python 相关文章推荐
Python 3.x 新特性及10大变化
Jun 12 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 Python
Python学习小技巧之列表项的拼接
May 20 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
Python字符串的常见操作实例小结
Apr 08 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
Aug 07 Python
Python操作MongoDb数据库流程详解
Mar 05 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
Feb 06 Python
Python 连连看连接算法
Nov 22 #Python
python sqlobject(mysql)中文乱码解决方法
Nov 14 #Python
Python转码问题的解决方法
Oct 07 #Python
Python函数学习笔记
Oct 07 #Python
Python日期操作学习笔记
Oct 07 #Python
wxPython 入门教程
Oct 07 #Python
新手该如何学python怎么学好python?
Oct 07 #Python
You might like
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
PHP实现将base64编码字符串转换成图片示例
2018/06/22 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
JavaScript将Table导出到Excel实现思路及代码
2013/03/13 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
2020/02/10 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
深入讲解Python编程中的字符串
2015/10/14 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
Python字符串拼接的几种方法整理
2017/08/02 Python
python excel使用xlutils类库实现追加写功能的方法
2018/05/02 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
python学习将数据写入文件并保存方法
2020/06/07 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
股权转让协议书范本
2014/04/12 职场文书
应届大学生自荐书
2014/06/17 职场文书
安全隐患整改报告
2014/11/06 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)
2021/07/01 HTML / CSS