本文实例讲述了python类和对象用法。分享给大家供大家参考,具体如下:

前面我们都是用python面向过程编程,现在来用python创建类和对象,面向对象编程。类和对象是面向对象编程的两个主要方面。类创建一个新类型,而对象这个类的 实例 。这类似于你有一个int类型的变量,这存储整数的变量是int类的实例(对象)。在python中,类和实例中的变量称为域,类和实例中的函数称为方法,域和方法都是类和实例的属性。

类的定义

在定义类或者它的函数的时候,如果没有参数的话,需要把参数写为self,这样在外部调用的时候能清楚调用的是哪个实例的函数。这个self表示的是当前的实例,与C++中的self和Java中的this是一样的。

空类

#!/usr/bin/python

# Filename: simplestclass.py

class Person:

pass # An empty block

p = Person()

print p

我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。在这个例子中,我们使用了一个空白块,它由pass语句表示。这样编译的时候就会跳过。这是一个空类。

接下来,我们使用类名后跟一对圆括号来创建一个对象/实例。因为这个类不需要任何的参数,所以创建的时候也不需要参数。

$ python simplestclass.py

<__main__.Person instance at 0xf6fcb18c>

打印这个对象,我们可以看到这个对象所属的类,以及它的内存地址。

__init__函数

在上面的例子中,我们没有写任何东西,但是还是会有一个默认的构造函数。在python中也有类似构造函数的东西,就是__init__函数。在创建对象的时候会自动调用这个函数。

#!/usr/bin/python

# Filename: class_init.py

class Person:

def __init__(self, name):

self.name = name

def sayHi(self):

print 'Hello, my name is', self.name

p = Person('Swaroop')

p.sayHi()

输出:

$ python class_init.py

Hello, my name is Swaroop

当新建一个person对象时,因为__init__中需要有name参数,所以需要提供一个参数。可以看到这个类中有一个自己的域,在构造的时候把name的值赋给对象里的name。

可以看到,sayHi并不需要参数,但是在定义函数时仍然要有参数self。

__del__函数

就如同init方法一样,还有一个特殊的方法del,它在对象消逝的时候被调用。相当于析构函数。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。但是很难保证这个方法究竟在什么时候运行。如果你想要指明它的运行,你就得使用del语句。代码例子和下面的在一起。

使用类的变量

Python中所有的类成员(包括数据成员)都是公共的,所有的方法都是有效的 。

只有一个例外:如果你使用的数据成员名称以双下划线前缀比如__privatevar,Python的名称管理体系会有效地把它作为私有变量。

这样就有一个惯例,如果某个变量只想在类或对象中使用,就应该以单下划线前缀。而其他的名称都将作为公共的,可以被其他类/对象使用。

#!/usr/bin/python

# Filename: objvar.py

class Person:

'''Represents a person.'''

population = 0

def __init__(self, name):

'''Initializes the person's data.'''

self.name = name

print '(Initializing %s)' % self.name

# When this person is created, he/she

# adds to the population

Person.population += 1

def __del__(self):

'''I am dying.'''

print '%s says bye.' % self.name

Person.population -= 1

if Person.population == 0:

print 'I am the last one.'

else:

print 'There are still %d people left.' % Person.population

def sayHi(self):

'''Greeting by the person.

Really, that's all it does.'''

print 'Hi, my name is %s.' % self.name

def howMany(self):

'''Prints the current population.'''

if Person.population == 1:

print 'There is nobody here.'

else:

print 'We have %d persons here.' % Person.population

swaroop = Person('Swaroop')

swaroop.sayHi()

swaroop.howMany()

kalam = Person('Abdul Kalam')

kalam.sayHi()

kalam.howMany()

swaroop.sayHi()

swaroop.howMany()

输出:

$ python objvar.py

(Initializing Swaroop)

Hi, my name is Swaroop.

I am the only person here.

(Initializing Abdul Kalam)

Hi, my name is Abdul Kalam.

We have 2 persons here.

Hi, my name is Swaroop.

We have 2 persons here.

Abdul Kalam says bye.

There are still 1 people left.

Swaroop says bye.

There is nobody here.

这是一个很长的例子。这里,population属于Person类,因此是一个类的变量。name变量属于对象(它使用self赋值)因此是对象的变量。

观察可以发现init方法用一个名字来初始化Person实例。在这个方法中,我们让population增加1,这是因为我们增加了一个人。同样可以发现,self.name的值根据每个对象指定,这表明了它作为对象的变量的本质。

记住,你只能使用self变量来引用同一个对象的变量和方法。这被称为 属性引用。

当一个对象被清除的时候,del被调用,人数减少1并输出谁走了。一开始Abdul Kalam被自动清除了,后来Swaroop也被自动清除了。清除的顺序应该跟对象闲置的时间有关,当闲置时间达到某个值就清除掉。

继承

python的继承和C++还有JAVA没有什么不同,就是构造函数和其他函数里记得要在参数里加上self。函数的重载也是和C++,JAVA一样的。

例子:

#!/usr/bin/python

# Filename: inherit.py

class SchoolMember:

'''Represents any school member.'''

def __init__(self, name, age):

self.name = name

self.age = age

print '(Initialized SchoolMember: %s)' % self.name

def tell(self):

'''Tell my details.'''

print 'Name:"%s" Age:"%s"' % (self.name, self.age),

class Teacher(SchoolMember):

'''Represents a teacher.'''

def __init__(self, name, age, salary):

SchoolMember.__init__(self, name, age)

self.salary = salary

print '(Initialized Teacher: %s)' % self.name

def tell(self):

SchoolMember.tell(self)

print 'Salary: "%d"' % self.salary

class Student(SchoolMember):

'''Represents a student.'''

def __init__(self, name, age, marks):

SchoolMember.__init__(self, name, age)

self.marks = marks

print '(Initialized Student: %s)' % self.name

def tell(self):

SchoolMember.tell(self)

print 'Marks: "%d"' % self.marks

t = Teacher('Mrs. Shrividya', 40, 30000)

s = Student('Swaroop', 22, 75)

print # prints a blank line

members = [t, s]

for member in members:

member.tell() # works for both Teachers and Students

输出:

$ python inherit.py

(Initialized SchoolMember: Mrs. Shrividya)

(Initialized Teacher: Mrs. Shrividya)

(Initialized SchoolMember: Swaroop)

(Initialized Student: Swaroop)

Name:"Mrs. Shrividya" Age:"40" Salary: "30000"

Name:"Swaroop" Age:"22" Marks: "75"

schoolmenber是父类,学生和老师是子类,继承的方法为在类定义中把参数设为schoolmenber。可以看到,当我们继承一个类的时候,首先调用的是父类的构造函数,然后才是子类的。

希望本文所述对大家Python程序设计有所帮助。

python对象编程例子-python编程进阶之类和对象用法实例分析相关推荐

  1. python模块datetime_Python3.5内置模块之time与datetime模块用法实例分析

    本文实例讲述了Python3.5内置模块之time与datetime模块用法.分享给大家供大家参考,具体如下: 1.模块的分类 a.标准库(Python自带):sys.os模块 b.开源模块(第三方模 ...

  2. python中event的用法_Python编程之event对象的用法实例分析

    本文实例讲述了Python编程中event对象的用法.分享给大家供大家参考,具体如下: Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位为假,则线程等待直到信号 ...

  3. python asyncio回调函数_python回调函数用法实例分析

    python回调函数用法实例分析 本文实例讲述了python回调函数用法.分享给大家供大家参考.具体分析如下: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步 ...

  4. python中property函数_python 邮件表格Python中property函数用法实例分析

    本文实例讲述了Python中property函数用法.分享给大家供大家参考,具体如下: 通常我们在访问和赋值属性的时候,都是在直接和类(实例的)的__dict__打交道,或者跟数据描述符等在打交道.但 ...

  5. python中max函数用法_Python中max函数用法实例分析

    Python中max函数用法实例分析 更新时间:2015年07月17日 15:45:09 作者:优雅先生 这篇文章主要介绍了Python中max函数用法,实例分析了Python中max函数的功能与使用 ...

  6. python对象编程例子-Python 面向对象编程实例讲解

    如果你没有任何以往的经验与面向对象(OO)编程,你可能想咨询或至少某种教程的入门课程,所以,你必须掌握的基本概念. 然而,这里是小推出的面向对象编程(OOP)给你带来更好的学习速度: OOP的术语概述 ...

  7. python对象编程例子-python面向对象编程练习

    练习题 1.面向对象三大特性,各有什么用处,说说你的理解. 面向对象的三大特性: 1.继承:解决代码的复用性问题 2.封装:对数据属性严格控制,隔离复杂度 3.多态性:增加程序的灵活性与可扩展性 2. ...

  8. python对象编程例子-python(十二)面向对象编程、类

    面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一个功 ...

  9. python对象编程例子-python面向对象编程:python类和实例讲解

    东尧爱分享 这是东尧每天一篇文章的第51天 东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福. 1 什么是对象 在python里面,一切皆为对象.也就是说python里的所有数据都 ...

最新文章

  1. php amqp扩展安装,php扩展AMQP,安装报错解决
  2. 计算机仿真和vr的区别,AR对比VR有何不同?你能分清楚他们的区别么
  3. 5%精度的电阻值间的倍率,倍数
  4. 美国物流管理协会更名标志全球物流进入供应链时代
  5. js ajax传对象数组参数,JS传递对象数组为参数给后端,后端获取
  6. log4j.xml引用Javaweb项目中配置文件的参数
  7. 凭自己本事单的身是一种怎样的体验?你根本配不上如此优秀的我!
  8. 开挂的人生: 本科生发Nature和 Science
  9. 4个独立按键实现对数码管数字显示的加减清零等
  10. 在Mac OS X中使用VIM开发STM32(3)
  11. C++ Primer 5th Answers
  12. Lseg(Language -driven semantic segmentation)
  13. IT行业,一年最痛苦的事莫过于没有年终奖
  14. 智能服务器升级中,全面智能升级! 宁畅G40服务器释放强大算力
  15. linux下低格u盘,u盘低级格式化操作
  16. [转]浅析360的危害 我为什么推荐卸载360
  17. 图像的仿射变换:cv2.warpAffine()
  18. 计算机一级excel中模拟运算,excel2000计算机一级专题.docx
  19. 美式期权、欧式期权比较分析——定价与风险管理
  20. 第一周预习HTML标签(笔记可以不记,代码一定要敲)

热门文章

  1. EOS/普元:中国IT业的悲哀
  2. WSS(MOSS)如何修改Rich文本编辑器的宽度
  3. 前端——JavaScript
  4. db2 order by 利用索引
  5. matlab、python使用小方法收集
  6. Winform开发框架中的综合案例Demo
  7. sequoiadb sdbexprt 导入工具进阶使用
  8. 关于Python的装饰器(1)
  9. UIView上的控件使用push方法跳转
  10. cocos2d-x CCParticleSystem粒子系统