Python中的面向对象编程(类编程)由简单到复杂的示例代码
关于本文代码中的self的含义,大家可参考下面这篇博文:
https://blog.csdn.net/wenhao_ir/article/details/125384347
另:说明一下,本博文中“成员函数”的意思和“方法”的意思一样。
目录
- 01-最简单的Python面向对象编程(类编程)示例代码
- 02-类中的成员函数引用类的成员变量的情况
- 03-带构造函数(初始化函数)的情况
- 04-成员函数带参数(不包括构造函数)
- 05-方法调用方法的情况
- 06-类的继承(父类与子类)
- 06-附1-在类的定义中调用父类的方法
- 07-使用修饰符classmethod定义不需要实例化对象就能调用的方法
- 08-使用修饰符staticmethod声明一个静态方法(调用时无需传参数,不用实例化即可被调用)
- 09-使用修饰符property将方法变为变量的方式调用
- 一些与代码规范化相关的建议
01-最简单的Python面向对象编程(类编程)示例代码
class Fruit:color = 'red'def taste(self):return 'delicious'apple = Fruit()
a_character = apple.color
b_character = apple.taste()print('\na_character:{}'.format(a_character))
print('b_character:{}'.format(b_character))
运行结果如下图所示:
02-类中的成员函数引用类的成员变量的情况
class Staff: # Staff为员工的意思bonus = 30000 # bonus为津贴、奖金的意思def salary(self): # salary为工资的意思salary = 10000+self.bonusreturn salaryzhang_san = Staff()
zhang_san_salray = zhang_san.salary()
运行结果如下所示:
03-带构造函数(初始化函数)的情况
class Staff: # Staff为员工的意思def __init__(self, bonus): # bonus为津贴、奖金的意思self.bonus = bonusdef salary(self): # salary为工资的意思salary = 10000+self.bonusreturn salaryzhang_san = Staff(3000)
zhang_san_salray = zhang_san.salary()
运行结果如下:
04-成员函数带参数(不包括构造函数)
class AnimalBaseClass:def __init__(self, num):self.animallegs = numself.head_num = 0def walk(self):print('走')def cry(self):print('叫')def get_legs_num(self):print(self.animallegs)def input_head_num(self, num2):self.head_num = num2def get_head_num(self):print(self.head_num)animal = AnimalBaseClass(4)
animal.input_head_num(1)animal.get_legs_num()
animal.get_head_num()
上面的代码中,成员函数input_head_num()是带了参数的。
运行结果如下:
05-方法调用方法的情况
示例代码如下:
class A(object):bar = 1def func1(self):print('foo')def func2(self):print('func2')print(self.bar)self.func1() # 调用方法func1()a1 = A()
a1.func2()
运行结果如下:
06-类的继承(父类与子类)
class AnimalBaseClass:def __init__(self, num):self.animallegs = numdef walk(self):print('走')def cry(self):print('叫')def get_legs_num(self):print(self.animallegs)class BirdClass(AnimalBaseClass):head_num = 1def cry(self):print('吱吱叫')def run(self):print('跑')def get_head_num(self):print(self.head_num)piyo_suke = BirdClass(2)
piyo_suke.cry()
piyo_suke.run()
piyo_suke.get_legs_num()
piyo_suke.get_head_num()
在上面的代码中,类BirdClass继承于类AnimalBaseClass,它拥有类AnimalBaseClass的变量和成员函数。
运行结果如下:
当父类和子类都拥有同样名称的成员函数时,子类调用这个成员函数时会优先调用子类中成员函数,这个功能叫重写(覆盖),英文中的叫法叫“override”所以上面的代码中语句
piyo_suke.cry()
的运行结果为“吱吱叫”,而不是“叫”。
不仅是一般的成员函数能被改写,构造函数也可以在子类中重写,比如下面的代码:
class AnimalBaseClass:def __init__(self, num):self.animallegs = numdef walk(self):print('走')def cry(self):print('叫')def get_legs_num(self):print(self.animallegs)class BirdClass(AnimalBaseClass):def __init__(self, num1, num2):self.animallegs = num1self.head_num = num2def cry(self):print('吱吱叫')def run(self):print('跑')def get_head_num(self):print(self.head_num)piyo_suke = BirdClass(3, 1)
piyo_suke.cry()
piyo_suke.run()
piyo_suke.get_legs_num()
piyo_suke.get_head_num()
上面的代码中,子类BirdClass的构造函数和父类AnimalBaseClass不一样。
运行结果如下:
要注意,你的代码中用到了哪些成员变量,你在构造函数就要注意把它初始化,否则调用时会出错,比如下面这样写就不行:
class BirdClass(AnimalBaseClass):def __init__(self, num2):self.head_num = num2def cry(self):print('吱吱叫')def run(self):print('跑')def get_head_num(self):print(self.head_num)piyo_suke = BirdClass(1)
piyo_suke.cry()
piyo_suke.run()
piyo_suke.get_legs_num()
piyo_suke.get_head_num()
上面的代码中,成员函数get_legs_num()用到了成员变量animallegs,但是没有进行初始化,所以在调用语句piyo_suke.get_legs_num()时会报下面这样的错:
06-附1-在类的定义中调用父类的方法
示例代码如下:
class A:def __init__(self):print('Enter A')def fun1(self, a, b):print('fun1的结果为{}'.format((a+b)))class B(A):def __init__(self):print('Enter B')self.x = 100self.y = 88def fun2(self):A.fun1(self, self.x, self.y)object1 = B()
object1.fun2()
运行结果如下:
在上面的代码中,B类为A的子类,在B类的方法fun2()中,调用了其父类A中的方法fun1(),注意,此时第一个参数self要写上,即语句:
A.fun1(self, self.x, self.y)
不能写成:
A.fun1(self.x, self.y)
更高级的关于类的定义中调用父类的方法【使用内置函数super()】,请参阅我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/125472478
07-使用修饰符classmethod定义不需要实例化对象就能调用的方法
classmethod 修饰符对应的方法第一个参数我们通常不取名为self,而取名为cls。关于类的方法的第一参数的详解,见我的另一篇博文https://blog.csdn.net/wenhao_ir/article/details/125384347
这样的方法通常用来输出类的一些属性信息等,或者执行一些不需要初始化值的功能等。
示例代码如下:
class A(object):bar = 1def func1(self):print('foo')@classmethoddef func2(cls):print('func2')print(cls.bar)cls().func1() # 调用方法func1()A.func2() # 方法func2不需要实例化即可被调用
运行结果如下:
注意:上面代码中的语句:
cls().func1()
不能像需要实例化的方法那样写成:
cls.func1()
cls()相当于还是在执行func2()时临时产生了一个对象。
08-使用修饰符staticmethod声明一个静态方法(调用时无需传参数,不用实例化即可被调用)
示例代码如下:
class MyClass(object):@staticmethod # 使用修饰符staticmethod声明一个静态方法def f1():print('My name is SuWenhao')MyClass.f1() # 静态方法无需实例化即可调用obj1 = MyClass()
obj1.f1() # 静态方法也可实例化后调用
运行结果如下:
09-使用修饰符property将方法变为变量的方式调用
示例代码如下:
class A:def __init__(self):print('Enter A')self.name = 'admin'self.pwd = '123456'@propertydef fun1(self):print("当前的用户名:{0},密码:{1}".format(self.name, self.pwd))a1 = A()
a1.fun1
运行结果如下:
分析:在上面的示例代码中,方法fun1()被修饰符property修饰,从而使这个方法的调用变为变量方式的调用。
什么叫变量方式的调用?
先来看正常方式的调用,方法fun1()的正常调用语句如下:
a1.fun1()
变量方式的调用如下:
a1.fun1
可见区别就在于正常方式有括号,而变量方式调用没有括号。
总结一下:对于方法fun1(),如果没有被修饰符property修饰,则应该按下面的方式调用:
a1.fun1()
如果被修饰符property修饰,则应该按下面的方式调用:
a1.fun1
一些与代码规范化相关的建议
在代码的书写格式上注意以下几点(非必须,但是这样书写出来的代码漂亮好看且规范):
- 成员变量与成员函数之间要有一个空行;
- 成员函数与成员函数之间要有一个空行;
- 类与主体代码之间要有两个空行;
- 类与类之间也要有个两个空行;
- 类名用驼峰法命名(关于命名规则,可参考博文 https://blog.csdn.net/wenhao_ir/article/details/123117194);
Python中的面向对象编程(类编程)由简单到复杂的示例代码相关推荐
- python中的面向对象:类与对象(重点!!!)
Python中重点与难点,必须熟练掌握!!! 一.面向对象 1.面向对象概念 面向对象(Object Oriented,OO)是软件开发方法,是一种思想.面向对象的对象是指客观世界存在的事物. 我们之 ...
- python中的面向对象、类
面向对象简介 1.面向对象的编程方法是利用"类"和"对象"来创建各种模型来实现对真实世界的描述,它可以简化程序的维护和扩展,提高程序开发效率 ,代码逻辑易于理解 ...
- Python中的面向对象(类的实例化,面向对象的封装、继承与多态)
文章目录 1.面向对象的定义 1.1 定义类.属性和方法 1.2 如何将类转化为对象(实例化) 1.3 构造方法 2.面向对象的封装 2.1 封装的定义 2.2 封装的练习 1.体重与跑步 2.栈的功 ...
- python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?
现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 以下为译文: Python支持多种类型的编 ...
- python如何初始化对象数组_如何理解Python中的面向对象编程?
(由Python大本营付费下载自视觉中国) 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 现如今面向对象编程的使用非常广泛,本文 ...
- 如何理解 Python 中的面向对象编程?
现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews ...
- 什么是Python中的套接字编程?
摘要:本文涵盖了有关使用Python进行套接字编程的所有领域.套接字可以帮助您建立这些连接,而Python无疑可以简化连接. 本文分享自华为云社区<从零开始学python | 什么是Python ...
- python属于面向对象的还是面向过程的呀-python中的面向对象和面向过程
一.面向对象和面向过程 一.什么是面向过程 核心是过程二字:面向过程是一种流水线的工作流程,是先做什么在做什么 二.什么是面向对象 核心 是对象二字:是一种编程思想,上帝思维,一切皆对象,编程中负责调 ...
- 如何理解Python中的面向对象
一.认识面向对象是什么 面向过程的程序设计的核心就是过程,就是流水线式的思维,过程就是解决问题的步骤,面向过程的设计就好像一条设计好的流水线,考虑周全什么就处理什么东西. 优点在于极大地降低了写程序的 ...
最新文章
- java 无符号转有符号_java有符号无符号的转换
- python 数据逐个验证_在python中验证数据的最佳方法是什么?
- Android application捕获崩溃异常
- 【Web】HTTPS 引入http资源,混合内容
- SQL Server-事务处理(Tansaction)与锁(Lock)
- uva 10692——Huge Mods
- 邻近算法(KNN算法)
- MySql5.6版修改用户登录密码
- php JWT在web端的使用方法
- android 应用置顶到最前端_uniApp / 小程序实现一个view滚动到一定高度置顶显示
- mips linux gcc mingw,gcc
- Eclipse 汉化包下载安装
- (备忘)怎么去除WinRAR弹窗广告?
- Rose环境和用例图
- 密码编码学与网络安全(第五版)答案
- 51nod 1384
- 实数系与实数定理(下)
- 传奇服务器常见的网络攻击方式有哪些?-版本被攻击
- html文字旋转以后变形,CSS3中的变形处理——transform功能(旋转、缩放、倾斜、移动)...
- Oculus Quest2 游戏应用商店:87VRHOME第二版更新介绍
热门文章
- 炉石服务器不稳定,炉石传说服务器炸了什么问题 一直排不到人原因和解决方法...
- word、ppt、excel排版、讲解
- 用python摘取汇总多个txt文件关键信息汇总写入excel
- 数字中国:智慧城市中的的大格局与大视野
- vim的超详细使用方法
- VMware 16安装的Ubuntu18.04 系统,无法在Windows和Ubuntu之间直接自由拖拽复制文件
- 酷狗直播发力,领跑“虚拟”二次元文化圈
- 【Python】PC端听书工具
- 蓝牙耳机将全面进入无线时代
- 认知智能的突围:NLP、知识图谱是AI下一个“掘金地”?