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 while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
HTML中使用python屏蔽一些基本功能的方法
Jul 07 Python
基于Python中numpy数组的合并实例讲解
Apr 04 Python
Python pymongo模块常用操作分析
Sep 01 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
pygame实现俄罗斯方块游戏(AI篇2)
Oct 29 Python
python 线性回归分析模型检验标准--拟合优度详解
Feb 24 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
Python私有属性私有方法应用实例解析
Sep 15 Python
Python类成员继承重写的实现
Sep 16 Python
Python 2.6.6升级到Python2.7.15的详细步骤
Dec 14 Python
Python实现小黑屋游戏的完整实例
Jan 06 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 zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php执行sql语句的写法
2009/03/10 PHP
php set_time_limit()函数的使用详解
2013/06/05 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
php异常处理捕获错误整理
2019/09/23 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
2019/08/04 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
社会实践心得体会
2014/01/03 职场文书
志愿者服务感言
2014/02/27 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
市场营销工作计划书
2014/09/15 职场文书
银行转正自我鉴定
2014/09/29 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android
使用CSS连接数据库的方式
2022/02/28 HTML / CSS