关于本文代码中的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中的面向对象编程(类编程)由简单到复杂的示例代码相关推荐

  1. python中的面向对象:类与对象(重点!!!)

    Python中重点与难点,必须熟练掌握!!! 一.面向对象 1.面向对象概念 面向对象(Object Oriented,OO)是软件开发方法,是一种思想.面向对象的对象是指客观世界存在的事物. 我们之 ...

  2. python中的面向对象、类

    面向对象简介 1.面向对象的编程方法是利用"类"和"对象"来创建各种模型来实现对真实世界的描述,它可以简化程序的维护和扩展,提高程序开发效率 ,代码逻辑易于理解 ...

  3. Python中的面向对象(类的实例化,面向对象的封装、继承与多态)

    文章目录 1.面向对象的定义 1.1 定义类.属性和方法 1.2 如何将类转化为对象(实例化) 1.3 构造方法 2.面向对象的封装 2.1 封装的定义 2.2 封装的练习 1.体重与跑步 2.栈的功 ...

  4. python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?

    现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 以下为译文: Python支持多种类型的编 ...

  5. python如何初始化对象数组_如何理解Python中的面向对象编程?

    (由Python大本营付费下载自视觉中国) 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 现如今面向对象编程的使用非常广泛,本文 ...

  6. 如何理解 Python 中的面向对象编程?

    现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews ...

  7. 什么是Python中的套接字编程?

    摘要:本文涵盖了有关使用Python进行套接字编程的所有领域.套接字可以帮助您建立这些连接,而Python无疑可以简化连接. 本文分享自华为云社区<从零开始学python | 什么是Python ...

  8. python属于面向对象的还是面向过程的呀-python中的面向对象和面向过程

    一.面向对象和面向过程 一.什么是面向过程 核心是过程二字:面向过程是一种流水线的工作流程,是先做什么在做什么 二.什么是面向对象 核心 是对象二字:是一种编程思想,上帝思维,一切皆对象,编程中负责调 ...

  9. 如何理解Python中的面向对象

    一.认识面向对象是什么 面向过程的程序设计的核心就是过程,就是流水线式的思维,过程就是解决问题的步骤,面向过程的设计就好像一条设计好的流水线,考虑周全什么就处理什么东西. 优点在于极大地降低了写程序的 ...

最新文章

  1. java 无符号转有符号_java有符号无符号的转换
  2. python 数据逐个验证_在python中验证数据的最佳方法是什么?
  3. Android application捕获崩溃异常
  4. 【Web】HTTPS 引入http资源,混合内容
  5. SQL Server-事务处理(Tansaction)与锁(Lock)
  6. uva 10692——Huge Mods
  7. 邻近算法(KNN算法)
  8. MySql5.6版修改用户登录密码
  9. php JWT在web端的使用方法
  10. android 应用置顶到最前端_uniApp / 小程序实现一个view滚动到一定高度置顶显示
  11. mips linux gcc mingw,gcc
  12. Eclipse 汉化包下载安装
  13. (备忘)怎么去除WinRAR弹窗广告?
  14. Rose环境和用例图
  15. 密码编码学与网络安全(第五版)答案
  16. 51nod 1384
  17. 实数系与实数定理(下)
  18. 传奇服务器常见的网络攻击方式有哪些?-版本被攻击
  19. html文字旋转以后变形,CSS3中的变形处理——transform功能(旋转、缩放、倾斜、移动)...
  20. Oculus Quest2 游戏应用商店:87VRHOME第二版更新介绍

热门文章

  1. 炉石服务器不稳定,炉石传说服务器炸了什么问题 一直排不到人原因和解决方法...
  2. word、ppt、excel排版、讲解
  3. 用python摘取汇总多个txt文件关键信息汇总写入excel
  4. 数字中国:智慧城市中的的大格局与大视野
  5. vim的超详细使用方法
  6. VMware 16安装的Ubuntu18.04 系统,无法在Windows和Ubuntu之间直接自由拖拽复制文件
  7. 酷狗直播发力,领跑“虚拟”二次元文化圈
  8. 【Python】PC端听书工具
  9. 蓝牙耳机将全面进入无线时代
  10. 认知智能的突围:NLP、知识图谱是AI下一个“掘金地”?