Python之面向对象编程、类

news/2024/7/4 1:45:40 标签: python, , 面向对象编程, class
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

目录

前言

面向对象技术

class="tags" href="/tags/Lei.html" title=类>类

class="tags" href="/tags/Lei.html" title=类>类定义

class="tags" href="/tags/Lei.html" title=类>类属性和方法

self代表class="tags" href="/tags/Lei.html" title=类>类的实例,而非class="tags" href="/tags/Lei.html" title=类>类

__init__()方法

class="tags" href="/tags/Lei.html" title=类>类的私有属性和方法

class="tags" href="/tags/Lei.html" title=类>类的继承

方法重写

导入class="tags" href="/tags/Lei.html" title=类>类

最后


前言

class="tags" href="/tags/MianXiangDuiXiangBianCheng.html" title=面向对象编程>面向对象编程是最有效的软件编写方法之一。Python从设计之初就已经是一门面向对象的语言,所以在Python中创建一个class="tags" href="/tags/Lei.html" title=类>类和对象是很容易的。接下来我们学习class="tags" href="/tags/MianXiangDuiXiangBianCheng.html" title=面向对象编程>面向对象编程。

面向对象技术

面向对象技术包含以下内容:

  • class="tags" href="/tags/Lei.html" title=类>类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是class="tags" href="/tags/Lei.html" title=类>类的实例。
  • 方法:class="tags" href="/tags/Lei.html" title=类>类中定义的函数。
  • class="tags" href="/tags/Lei.html" title=类>类变量:class="tags" href="/tags/Lei.html" title=类>类变量在整个实例化的对象中是公用的。class="tags" href="/tags/Lei.html" title=类>类变量定义在class="tags" href="/tags/Lei.html" title=类>类中且在函数体之外。class="tags" href="/tags/Lei.html" title=类>类变量通常不作为实例变量使用。
  • 数据成员:class="tags" href="/tags/Lei.html" title=类>类变量或者实例变量用于处理class="tags" href="/tags/Lei.html" title=类>类及其实例对象的相关的数据。
  • 方法重写:如果从父class="tags" href="/tags/Lei.html" title=类>类继承的方法不能满足子class="tags" href="/tags/Lei.html" title=类>类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的class="tags" href="/tags/Lei.html" title=类>类。
  • 实例变量:class="tags" href="/tags/Lei.html" title=类>类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
  • 继承:即一个派生class="tags" href="/tags/Lei.html" title=类>类(derived class)继承基class="tags" href="/tags/Lei.html" title=类>类(base class)的字段和方法。继承也允许把一个派生class="tags" href="/tags/Lei.html" title=类>类的对象作为一个基class="tags" href="/tags/Lei.html" title=类>类对象对待。例如,有这样一个设计:一个Dogclass="tags" href="/tags/Lei.html" title=类>类型的对象派生自Animalclass="tags" href="/tags/Lei.html" title=类>类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个class="tags" href="/tags/Lei.html" title=类>类的实例,class="tags" href="/tags/Lei.html" title=类>类的具体对象。
  • 对象:通过class="tags" href="/tags/Lei.html" title=类>类定义的数据结构实例。对象包括两个数据成员(class="tags" href="/tags/Lei.html" title=类>类变量和实例变量)和方法。

Python中的class="tags" href="/tags/Lei.html" title=类>类提供了class="tags" href="/tags/MianXiangDuiXiangBianCheng.html" title=面向对象编程>面向对象编程的所有基本功能:class="tags" href="/tags/Lei.html" title=类>类的继承机制允许多个基class="tags" href="/tags/Lei.html" title=类>类,派生class="tags" href="/tags/Lei.html" title=类>类可以覆盖基class="tags" href="/tags/Lei.html" title=类>类中的任何方法,方法中可以调用基class="tags" href="/tags/Lei.html" title=类>类中的同名方法。

对象可以包含任意数量和class="tags" href="/tags/Lei.html" title=类>类型的数据。

class="tags" href="/tags/Lei.html" title=类>类

class="tags" href="/tags/Lei.html" title=类>类定义

语法格式如下:

class="language-class="tags" href="/tags/PYTHON.html" title=python>python">class class="tags" href="/tags/Lei.html" title=类>类名:
     方法体1

     方法体2

其实我们的class="tags" href="/tags/Lei.html" title=类>类相当于一class="tags" href="/tags/Lei.html" title=类>类事物,class="tags" href="/tags/Lei.html" title=类>类名相当于那class="tags" href="/tags/Lei.html" title=类>类事物的统称,方法体相当于对那class="tags" href="/tags/Lei.html" title=类>类事物的描述,例如:

class="language-class="tags" href="/tags/PYTHON.html" title=python>python">class Superman():       #定义一个Supermanclass="tags" href="/tags/Lei.html" title=类>类
    def __init__(self,name):     #方法__init__()
        self.name=name           #初始化属性name

    def fly(self):               #定义方法fly()
        print(self.name +" can fly")    #给予会飞的技能   

    def shapeshift(self):        #定义方法shapeshift
        print(self.name +"can shapeshift")  #给予会变身的技能
super=Superman('Batman')        #调用Supermanclass="tags" href="/tags/Lei.html" title=类>类,并赋值
super.fly()                     #使用fly()方法

输出结果为:

class="language-class="tags" href="/tags/PYTHON.html" title=python>python">Batman can fly

class="tags" href="/tags/Lei.html" title=类>类属性和方法

class="tags" href="/tags/Lei.html" title=类>类中的函数称为方法,我们之前学到的有关函数的一切都适用于方法,就目前而言,位置的差别是调用方法的方式。class="tags" href="/tags/Lei.html" title=类>类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,class="tags" href="/tags/Lei.html" title=类>类方法必须包含参数 self, 且为第一个参数,self 代表的是class="tags" href="/tags/Lei.html" title=类>类的实例。

self代表class="tags" href="/tags/Lei.html" title=类>类的实例,而非class="tags" href="/tags/Lei.html" title=类>类

class="tags" href="/tags/Lei.html" title=类>类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

__init__()方法

class="tags" href="/tags/Lei.html" title=类>类有一个名为 __init__() 的特殊方法(构造方法),该方法在class="tags" href="/tags/Lei.html" title=类>类实例化时会自动调用,这个方法名称中,开头和末尾各有两个下划线,这是一种约定,为了避免Python默认方法与普通方法发生名称冲突。

 __init__() 方法可以有参数,参数通过 __init__() 传递到class="tags" href="/tags/Lei.html" title=类>类的实例化操作上。例如:

class="language-class="tags" href="/tags/PYTHON.html" title=python>python">class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i)   

输出结果为:

3.0 -4.5

class="tags" href="/tags/Lei.html" title=类>类的私有属性和方法

两个下划线开头,声明该属性为私有,不能在class="tags" href="/tags/Lei.html" title=类>类的外部被使用或直接访问。

两个下划线开头,声明该方法为私有方法,只能在class="tags" href="/tags/Lei.html" title=类>类的内部调用 。

例如:__weight=0,这个就是私有属性,def __private_method(self,n,a):,这个就是私有方法。

class="tags" href="/tags/Lei.html" title=类>类的继承

我们编写class="tags" href="/tags/Lei.html" title=类>类时不是总要从头开始写,如果我们要写的class="tags" href="/tags/Lei.html" title=类>类和另一个已经存在的class="tags" href="/tags/Lei.html" title=类>类有一样的方法,那我们可以使用继承。一个class="tags" href="/tags/Lei.html" title=类>类继承另一个class="tags" href="/tags/Lei.html" title=类>类时,它将自动获取另一个class="tags" href="/tags/Lei.html" title=类>类的所有属性和方法。原有的class="tags" href="/tags/Lei.html" title=类>类称为父class="tags" href="/tags/Lei.html" title=类>类,而新class="tags" href="/tags/Lei.html" title=类>类称为子class="tags" href="/tags/Lei.html" title=类>类。子class="tags" href="/tags/Lei.html" title=类>类继承了其父class="tags" href="/tags/Lei.html" title=类>类的所有属性和方法,同时还可以定义自己的属性和方法。

继承的语法为:

class="language-class="tags" href="/tags/PYTHON.html" title=python>python">class class="tags" href="/tags/Lei.html" title=类>类名1:            #class="tags" href="/tags/Lei.html" title=类>类名1是父class="tags" href="/tags/Lei.html" title=类>类
    方法体:

class class="tags" href="/tags/Lei.html" title=类>类名2:
    方法体:

class class="tags" href="/tags/Lei.html" title=类>类名3(class="tags" href="/tags/Lei.html" title=类>类名1):      #class="tags" href="/tags/Lei.html" title=类>类名2是子class="tags" href="/tags/Lei.html" title=类>类,继承class="tags" href="/tags/Lei.html" title=类>类名1的属性和方法,单继承

class class="tags" href="/tags/Lei.html" title=类>类名4(class="tags" href="/tags/Lei.html" title=类>类名1,class="tags" href="/tags/Lei.html" title=类>类名2):  #多继承

例如:

class="language-class="tags" href="/tags/PYTHON.html" title=python>python">class people:
    name = ''       #定义基本属性
    age = 0

    __weight = 0    #定义私有属性,私有属性在class="tags" href="/tags/Lei.html" title=类>类外部无法直接进行访问
   
    def __init__(self,n,a,w):    #定义构造方法
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))
 
class student(people):      #单继承示例
    grade = ''
    def __init__(self,n,a,w,g):
        people.__init__(self,n,a,w)    #调用父class="tags" href="/tags/Lei.html" title=类>类的构函
        self.grade = g

    def speak(self):                   #覆写父class="tags" href="/tags/Lei.html" title=类>类的方法
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
 
s = student('ken',10,60,3)
s.speak()

输出结果为:

ken 说: 我 10 岁了,我在读 3 年级

方法重写

如果我们的父class="tags" href="/tags/Lei.html" title=类>类方法的功能不能满足你的需求,我们可以在子class="tags" href="/tags/Lei.html" title=类>类重写父class="tags" href="/tags/Lei.html" title=类>类的方法,例如:

class="language-class="tags" href="/tags/PYTHON.html" title=python>python">class Parent:        # 定义父class="tags" href="/tags/Lei.html" title=类>类
   def myMethod(self):
      print ('调用父class="tags" href="/tags/Lei.html" title=类>类方法')
 
class Child(Parent): # 定义子class="tags" href="/tags/Lei.html" title=类>类
   def myMethod(self):
      print ('调用子class="tags" href="/tags/Lei.html" title=类>类方法')
 
c = Child()          # 子class="tags" href="/tags/Lei.html" title=类>类实例
c.myMethod()         # 子class="tags" href="/tags/Lei.html" title=类>类调用重写方法
super(Child,c).myMethod() #用子class="tags" href="/tags/Lei.html" title=类>类对象调用父class="tags" href="/tags/Lei.html" title=类>类已被覆盖的方法

输出结果为:

调用子class="tags" href="/tags/Lei.html" title=类>类方法
调用父class="tags" href="/tags/Lei.html" title=类>类方法

这里的super()是一个特殊函数,帮助Python将父class="tags" href="/tags/Lei.html" title=类>类和子class="tags" href="/tags/Lei.html" title=类>类关联起来。

导入class="tags" href="/tags/Lei.html" title=类>类

随着我们不断地给class="tags" href="/tags/Lei.html" title=类>类添加功能,文件可能变得很长,为了让文件尽可能整洁,我们可以在主程序中导入所需的模块。

class="language-class="tags" href="/tags/PYTHON.html" title=python>python">from 原程序的class="tags" href="/tags/Lei.html" title=类>类名 import 要导入class="tags" href="/tags/Lei.html" title=类>类的class="tags" href="/tags/Lei.html" title=类>类名     #导入单个class="tags" href="/tags/Lei.html" title=类>类
from 原程序的class="tags" href="/tags/Lei.html" title=类>类名 import 要导入class="tags" href="/tags/Lei.html" title=类>类的class="tags" href="/tags/Lei.html" title=类>类名1,要导入class="tags" href="/tags/Lei.html" title=类>类的class="tags" href="/tags/Lei.html" title=类>类名2   #导入多个class="tags" href="/tags/Lei.html" title=类>类
from 原程序的class="tags" href="/tags/Lei.html" title=类>类名 import *       #导入所有class="tags" href="/tags/Lei.html" title=类>类

最后

好啦,有关class="tags" href="/tags/MianXiangDuiXiangBianCheng.html" title=面向对象编程>面向对象编程、class="tags" href="/tags/Lei.html" title=类>类的知识我们就学到这里了,有不懂的可以评论区或私信我,谢谢观看,我们下篇文章再见!!!


http://www.niftyadmin.cn/n/1158342.html

相关文章

用Javascript获取页面元素的位置

制作网页的过程中,你有时候需要知道某个元素在网页上的确切位置。 下面的教程总结了Javascript在网页定位方面的相关知识。 一、网页的大小和浏览器窗口的大小 首先,要明确两个基本概念。 一张网页的全部面积,就是它的大小。通常情况下&#…

python多线程是假的_对比python的进程和线程:多线程是假的

进程,是系统进行资源分配最小单位(拥有独立的内存单元)。(python中多进程是真的)线程,是操作系统最小的执行单位(共享内存资源),比进程还小。(python中多线程是假的,因为cpython解释器中的一个模块GIL(全局解释器锁),G…

Python之如何读写文件

目录 前言 读文件 读取整个文件 关键字with 方法read() 逐行读取 写入文件 写入空文件 附加到文件 最后 前言 我们编写程序有时要让程序处理文件,分析大量的数据,那怎么读取文件,写入文件呢,这篇文章我们将学习处理文件…

python猴子选大王_cdoj525-猴子选大王 (约瑟夫环)

Sample input and outputSample InputSample Output13 23题解:赤裸的约瑟夫环。利用递推关系,有f[1] 0,f[i] (f[i-1] K) % i;一个递推就完成,时间复杂度为O(n)。代码:1 #include 23 using namespacestd;45 intmain(){6 intn,k,…

【html】【1】html的简单结构

1>我们为什么能打开html网页 计算机本身有个配置文件后缀打开程序的默认,好比:.txt >记事本打开 html>浏览器打开 文件一切的鼻祖都起源于.txt文件,你只要修改了相应的文件后缀(.txt改成.html),便可以用相应的程序[浏览器]运行代码了,当然 前…

软解界面总在最前端_Web前端开发需要掌握的技术

web前端工程师工作内容无非是以下几种   1.做网站设计、网页界面开发   2.做网页界面开发   3.做网页界面开发、前台数据绑定和前台逻辑的处理(我是属于这种的)   4.设计、开发、数据下面这几个就是web前端开发需要掌握的技术:1.学习html这个是最简单的,也是…

java环境变量的配置

目录 1、设置环境变量: 2、JDK基本命令 1、设置环境变量: 目的:让系统自动查找所需的命令。 主要包括:path环境变量和classpath环境变量。 (1)在“系统变量”新建:“JAVA_HOME”变量&#…

已修改内存占用高_OpenResty 和 Nginx 的共享内存区是如何消耗物理内存的

OpenResty 和 Nginx 服务器通常会配置共享内存区,用于储存在所有工作进程之间共享的数据。例如,Nginx 标准模块 ngx_http_limit_req 和 ngx_http_limit_conn 使用共享内存区储存状态数据,以限制所有工作进程中的用户请求速率和用户请求的并发…