python编程进阶之类和对象用法实例分析


Posted in Python onFebruary 21, 2020

本文实例讲述了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实现的百度站长自动URL提交小工具
Jun 27 Python
使用python实现省市三级菜单效果
Jan 20 Python
Python基础知识_浅谈用户交互
May 31 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
Pytorch之Variable的用法
Dec 31 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
Keras自定义IOU方式
Jun 10 Python
python获取系统内存占用信息的实例方法
Jul 17 Python
python实现快速文件格式批量转换的方法
Oct 16 Python
pytorch finetuning 自己的图片进行训练操作
Jun 05 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 #Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 #Python
python读写文件write和flush的实现方式
Feb 21 #Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 #Python
浅谈python中频繁的print到底能浪费多长时间
Feb 21 #Python
python使用Geany编辑器配置方法
Feb 21 #Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 #Python
You might like
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
js实现定时进度条完成后切换图片
2017/01/04 Javascript
教你用十行node.js代码读取docx的文本
2017/03/08 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
python3+PyQt5实现柱状图
2018/04/24 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
学生会竞选演讲稿怎么写
2014/08/26 职场文书
爱的承诺书
2015/01/20 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
旅游投诉信范文
2015/07/02 职场文书
Python面向对象编程之类的概念
2021/11/01 Python
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python