Python面向对象程序设计之类的定义与继承简单示例


Posted in Python onMarch 18, 2019

本文实例讲述了Python面向对象程序设计之类的定义与继承。分享给大家供大家参考,具体如下:

定义类:

class A:
  def __init__(self, name):
    self.name = name
  def say(self):
    print self.name
  def __del__(self):
    print "delete: %s" % self.name

1. python类的所有方法定义都必须至少含有一个参数,也就是self参数。在方法定义时作为第一个参数存在,self参数是类实例的引用。
2. __init__方法相当于构造函数,在获取类实例的时候会执行。
3. __del__方法相当于析构函数,会由系统自动调用(类似垃圾回收),也可以通过del对象主动调用。
4. 上例在__init__方法里定义了一个对象的变量name,可以在类内其他地方通过self.name引用。

获取类的实例并调用类方法:

a = A('Jim') #不用new
a.say() #Jim
A.say(a) #Jim

调用类的方法有两种方式:

1. 对象.方法名,此种方式self参数不需要指定,对象引用作为实参自动传入。
2. 类名.方法名,此种方式self参数需要指定为类实例的引用。

类变量和对象变量:

class A:
  pass
a = A()
print A.j #报错,因为A类中不存在类变量j
A.i = 1  #在A类中添加类变量i,并赋值1
print A.i #打印1
print a.i #打印1,这里的a.i实际上取到的是类A的类变量i,非对象a的对象变量i(其尚不存在)
a.j = 2  #在对象a中添加对象变量j,并赋值2
print A.j #报错,因为A类中不存在类变量j
print a.j #打印2
a.i = 3  #在对象a中添加对象变量i,并赋值3
b = A() 
print A.i #打印1,A.i取到的是A类中的类变量i
print a.i #打印3,a.i取到的是a对象中的对象变量i,取不到类A中的类变量i(因为重名优先获取对象变量)
print b.i #打印1,b.i取到的是A类中的类变量i

总结:

1. 对象的变量称为对象的域;类的变量称为类的域(相当于类静态变量)。类的域和方法合称类的属性。(我们没用域,而用了变量这个称呼)。
2. 类和对象的变量可以在类定义后随意添加。
3. 如果我们用 对象.i取用变量(取用而非赋值),会先试图取用对象变量i,若不存在则试图取用对象所属类中的类变量i,若还不存在则报错。
4. 可使用对象引用获取类变量值(在不存在重名的对象变量时),但不能用对象引用给类变量赋值(会创建同名对象变量)。

定义类变量:

在类内直接定义的变量是类变量,不属于某个特定对象,相当于静态变量,如:

class P:
  __pri = "private via"
  count = 1
print P.count #打印1
print P.__pri #报错,类P中没有名称为__pri的属性

1. 使用类变量通常用:类名.变量名
2. 类的属性默认是公有的;类定义中,变量名为双下划线开头的变量是私有的(依靠约定来保证)。

类的继承:

在类定义时,类名称后紧跟一个元组名,此类即为以元组的元素为父类的子类:

class SubClass(SuperClass):
   pass
class SubClass(SuperClass1, SuperClass2):
   pass

1. 若类没有显式的定义__init__方法,则python会自动生成一个__init__(self)方法;且如果这个类有父类,此子类自动生成的__init__(self)方法会依次调用父类的__init__(self)方法,若父类中没有__init__(self)这样的方法,执行就会报错。

2. 若显式定义__init__方法,父类的__init__方法不会自动调用,需要代码显式调用。这和java不同,java会自动在构造方法的第一句加入super()语句。

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

Python 相关文章推荐
python实现自动登录人人网并访问最近来访者实例
Sep 26 Python
Python实现Linux命令xxd -i功能
Mar 06 Python
Python中str is not callable问题详解及解决办法
Feb 10 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
python逆序打印各位数字的方法
Jun 25 Python
Python高斯消除矩阵
Jan 02 Python
python中eval与int的区别浅析
Aug 11 Python
python解释器spython使用及原理解析
Aug 24 Python
基于spring boot 日志(logback)报错的解决方式
Feb 20 Python
基于Django signals 信号作用及用法详解
Mar 28 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 Python
Python 中的单分派泛函数你真的了解吗
Jun 22 Python
Python动态赋值的陷阱知识点总结
Mar 17 #Python
Python将字符串常量转化为变量方法总结
Mar 17 #Python
实例讲解Python中整数的最大值输出
Mar 17 #Python
python3+selenium自动化测试框架详解
Mar 17 #Python
Django 中间键和上下文处理器的使用
Mar 17 #Python
Python时间和字符串转换操作实例分析
Mar 16 #Python
Python中numpy模块常见用法demo实例小结
Mar 16 #Python
You might like
PHP Undefined index报错的修复方法
2011/07/17 PHP
PHP数据类型的总结分析
2013/06/13 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
关于webuploader插件使用过程遇到的小问题
2016/11/07 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
python修改字典内key对应值的方法
2015/07/11 Python
python将字典内容存入mysql实例代码
2018/01/18 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
市场部业务员岗位职责
2014/04/02 职场文书
玄武湖导游词
2015/02/05 职场文书
2015年银行员工工作总结
2015/04/24 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers