Python中类与对象

 一、前言

    面向对象是一种设计哲学和方法论。它并非必需,不使用面向对象也可以编程。但有了面向对象,可以把程序组织得更有条理,让设计过程更加愉悦和轻松。面向对象:再解决问题的时候关注的是解决问题所需要的对象。

    Python是一种面向对象的高级语言。实际上,面向对象的编程方式是由面向过程的编程方式发展而来的。可以说,面向对象的编程是高级语言发展的第二发展阶段。第二发展阶段的面向对象的高级语言比第一阶段的面向过程的高级语言,具有更强的灵活性与可扩展性,目前,占据主流地位。本章中,首先将介绍类与对象到底是什么;然后介绍面向对象的编程语言。(面向对象本身是面向过程的封装)

面向过程:按照步骤划分;把一个任务,分解成具体的每一个步骤。

面向对象:按照功能对象进行划分;找到对象,确定对象属性和行为。

    面向对象保证了功能的统一性。例如,五子棋游戏要加入悔棋的功能,基于面向过程思想开发的程序需要改动输入、判断、显示等一系列步骤,甚至还要大规模地调整步骤之间的逻辑,这显然是非常麻烦的;在基于面向对象思想进行开发时,因为棋盘对象保存了游戏的画面,所以仅仅给棋盘对象增加回溯行为,玩家和规则系统对象不需要做任何调整。由此可见,面向对象编程更便于后续代码的维护和功能扩展。

二、类与对象的概念

        类是一个模板,一张蓝图。根据同一模板或蓝图可以创建出很多的具体实例。尽管这些实例可以有自己独特的特点,但是这些实例都是同一类东西,都是根据同一个模板或者蓝图创造出来的。这些实例可以被称为对象。所谓面向对象的编程,就是首先研究实例对象,抽象提炼出这些对象的特征属性,与特征行为,生成类。再以类为模板,生成一个又一个实例,最后针对一个又一个的实例对象进行编程。

        对象映射了现实生活中真实存在的事务,它可以看得见摸得着,,例如,你现在手里的这本书就是一个对象;类是抽象的,它是对一群具有相同特征和行为的事务的统称,例如,“书是人类进步的阶梯”中提到的书并不具体指哪本书,它就是一个类。

关系:         对象可以抽象为类        类可以实例化为对象

    在Python中所有类型都是类,如:int,float,bool,str等等。如果想知道自己操作的数据是什么类型的,可以使用内置函数type()。

  通过type()内置函数验证数据类型。

print(type(True))
print(type(2.3))
print(type(2))
print(type("hello"))
print(type([2,3,4]))
print(type({2,3,4}))
# <class 'bool'>
# <class 'float'>
# <class 'int'>
# <class 'str'>
# <class 'list'>
# <class 'set'>

    所有的面向对象的编程语言,都可以使用面问过程的编程方式。对于一般的程序员来说,更希望采用面向对象的编程方式:

(1)定义一个类,创建一个模板或者蓝图:

(a)抽象出类中的特征属性

(b)抽象出类的行为方法

(2)创建类实例,针对实例对象进行编程。

三、定义类的方法

     一般形式:

class 类名:

    属性名=属性值

    def 方法名(self):

        方法体

        属性类似于前面章节中所学的变量,方法类似于前面章节中所学的函数;

        方法参数列表中的第一个参数是一个指代对象的默认参数self。

        下面定义一个表示轿车的Car类,该类中包含描述轿车车轮数量的属性wheels和描述轿车行驶行为的方法drive()。

class Car:wheels=4      #公共属性def drive(self):print("行驶")
c1=Car()
c2=Car()
print(c1.wheels,c2.wheels)
Car.wheels=2
print(c1.wheels,c2.wheels)

    凡是人类,皆有姓名、性别、身高、体重等性质,这些性质被称为类型的属性(attribute),有时也称为数据成员(data member)。

    人还能做很多事情,例如说话(speak)、进食(eat)、思考(think)、学习(learn)等,这些行为是这个类型的方法(method),也可以叫成员函数(member function)。

在Python中,使用class关键字来定义一个类。它的一般语法如下:

class 类名:

定义构造函数

……

定义类属性

……

定义类函数

在创建类时,我们可以手动添加一个 “__init __() ”方法,该方法是一个特殊的方法,被称为构造函数(或构造方法)。构造函数在创建实例对象时被使用,每创建一个类的实例对象时,Python都会自动调用构造函数。一般说来,类名使用大写字母开头的驼峰命名法,类中的属性名与函数名,使用小写字母开头的驼峰命名法。 

Python类中,构造函数的语法格式如下:

      def __init__ (self,属性列表):

    程序块

    ……

        此处需要特别指出,由于打印问题,可能看到的是,在此函数的函数名中init的前后各有一条下划线。但是实际上,init开头和结尾是各有 2 条下划线,且中间没有空格。

     “__init __() ”函数可以包含多个参数,但必须包含1个名为 self的参数,且必须作为第一个参数。也就是说,类的构造函数最少要有一个 self 参数。仅包含 self 参数的“__init__(self)”构造函数,称为默认构造函数。

        类是一个模板,同一个类可以产生多个对象。当某个对象调用类函数时,该对象会把自身的引用作为第一个参数自动传给该函数,因此这些函数可以被称为是实例函数(或者对象函数)。“self”参数的具体作用是:将自身传递给实例函数。

   每个类默认都有一个__init__()方法,如果一个类中显式地定义了__init__()方法,那么创建对象时调用显式定义的__init__()方法;否则调用默认的__init__()方法。

  __init__()方法可以分为无参构造方法和有参构造方法。

  (1)当使用无参构造方法创建对象时,所有对象的属性都有相同的初始值。

  (2)当使用有参构造方法创建对象时,所有对象的属性可以有不同的初始值。

  下面定义一个包含无参构造方法和实例方法drive()的Car类,分别创建2个Car类的对象car_one和car_two,通过对象car_one和car_two调用drive()方法,示例代码如下:

class Car:def __init__(self):self.color="红色"def drive(self):print("车的颜色是"+str(self.color))
car_one=Car()
car_one.drive()
car_two=Car()
car_two.drive()
class Car:def __init__(self,color):self.color=color      #属性值和实例绑定def drive(self):print("车的颜色是"+str(self.color))
car_one=Car("红色")
car_one.drive()
car_two=Car("蓝色")
car_two.drive()

Python类中,定义类行为(可以被称为方法或函数)的语法格式如下:

def 函数名(self,属性列表):

程序块

……

设计一个名为Food的简单的类。这个类包含两个属性,用来记录信息。这两个属性分别为name与cal,代表食物名,以及食物的热量。

 

class Food:#关键字class表明,此处开始,定义了一个类,类名为Food。def __init__(self, name, cal):#定义了一个构造函数。这个构造函数的参数,有三个,分别为self、name和cal,“__init __() ”函数中的name和cal是这个类的两个属性self.name = nameself.cal = caldef eat(self):#第6至第10行,定义了一个类函数,用来返回信息print("\t每百克的" + self.name + "具有" \+ str(self.cal) + "卡路里的热量")return self.cal
p1=Food('蛋糕',100)
p1.eat()

四、对象及对象的使用

        创建对象的语法格式如下所示:

   对象名=类名()

        对象的使用本质上就是对类对象成员的使用,即访问属性或调用方法。访问属性或调用方法的语法格式如下:

    对象名.属性名

    对象名.方法名()

class Car:wheels=4def drive(self):print("行驶")
car=Car()
print(car.wheels)
print(car.drive())

    类的成员包括属性和方法,默认它们可以在类的外部被访问或调用,但考虑到数据安全问题,有时需要将其设置为私有成员,限制在类外部对其进行访问或调用。

    属性按声明的方式可以分为两类:类属性和实例属性。

    1.类属性

    类属性是声明在类内部、方法外部的属性。例如实例中Car类内部声明的wheels属性就是一个类属性。类属性可以通过类或对象进行访问,但只能通过类进行修改。

    2.实例属性

    实例属性是在方法内部声明的属性,Python支持动态添加实例属性。下面从访问实例属性、修改实例属性和动态添加实例属性3个方面对实例属性进行介绍。

    (1) 访问实例属性

    实例属性只能通过对象进行访问(不能通过类访问)。例如,定义一个包含方法和实例属性的类Car,创建Car类对象,并访问实例属性,代码如下:

class Car:def drive(self):self.wheels=4
car=Car()
print(car.drive())
print(car.wheels)
print(Car.wheels)

    (2)修改实例属性

        实例属性通过对象进行修改。例如,在以上实例中插入修改实例的代码,具体如下:

class Car:def drive(self):self.wheels=4
car=Car()
print(car.drive())
car.wheels=3
print(car.wheels)

    (3)动态添加实例属性

        Python支持在类的外部使用对象动态地添加实例属性。例如,在以上实例的末尾动态添加实例属性color,增加的代码如下:

class Car:def drive(self):self.wheels=4
car=Car()
print(car.drive())
car.color="红色"
print(car.wheels)
print(car.color)

    Python中的方法按定义方式和用途可以分为3类:实例方法、类方法和静态方法。

    (1)实例方法

    实例方法形似函数,但它定义在类内部、以self为第一个形参。如drive()就是一个实例方法。实例方法中的self代表对象本身,它会在实例方法被调用时自动接收由系统传递的调用该方法的对象。

    实例方法只能通过对象调用。例如,定义一个包含实例方法drive()的类Car,创建Car类的对象,分别通过对象和类调用实例方法,代码如下:

class Car:def drive(self):print("我是实例方法")
car=Car()
car.drive()
Car.drive()

 

    (2)类方法

      类方法定义在类内部、使用装饰器@classmethod修饰方法。类方法的语法格式如下所示:

      @classmethod

      def 类方法名(cls):

          方法体

       类方法中参数列表的第1个参数为cls,代表类本身,它会在类方法被调用时自动接收由系统传递的调用该类方法的类。

     例如,定义一个包含类方法stop()的Car类,代码如下:

class Car:@classmethoddef stop(cls):print("我是类方法")def drive(self):print("我是实例方法")
car=Car()
car.stop()
car.drive()
Car.stop()
Car.drive()

类方法中可以使用cls访问和修改类属性的值。例如,定义一个包含类属性、类方法的Car类,并在类方法中用cls访问和修改类的属性,然后创建Car类的对象car,对象car调用类方法。代码如下:

class Car:wheels=3@classmethoddef stop(cls):print(cls.wheels)cls.wheels=4print(cls.wheels)
car=Car()
car.stop()

    (3)静态方法

    静态方法是定义在类内部、使用装饰器@staticmethod修饰的方法。静态方法的语法格式如下所示:

    @staticmethod

     def 静态方法名():

         方法体

    与实例方法和类方法相比,静态方法没有任何默认参数,它使用于与类无关的操作,或者无须使用类成员的操作,常见于一些工具类中。

    例如,定义一个包含静态方法的Car类,代码如下:

class Car:@staticmethoddef test():print("我是静态方法")
car=Car()
car.test()
Car.test()

静态方法可以通过类和对象调用

    静态方法内部不能直接访问属性或方法,但可以使用类名访问类属性或调用类方法,实例代码如下:

class Car:wheels=3@staticmethoddef test():print("我是静态方法")#print(wheels)print(Car.wheels)
car=Car()
car.test()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/226186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024GoCN线下活动全面启动,赠送深圳MeetUp门票

2024年GoCN社区将全面启动一系列令人期待的线下活动---不仅将在北京、上海、深圳、武汉、成都、杭州、广州、西安等地举办 meetup&#xff0c;还将在北京和上海举办 GopherChina 大会。 2024议题征集通道已开启&#xff0c;欢迎各位有实战经验、独特观点的Gopher前来分享~ 2024…

@RestController

1、RestController说明 RestController是 Spring Framework 4.0 引入的一个注解&#xff0c;用于将一个类标记为 Rest 控制器。它是Controller和ResponseBody注解的组合&#xff0c;使得使用该注解的类在处理 HTTP 请求时更加方便和简洁。 RestController注解由以下几个部分组…

Anaconda中使用Jupyter出现’No module named ‘pymysql‘问题解决

问题截图&#xff1a; 解决办法&#xff1a; 一.找到Anaconda所在文件夹&#xff0c;文件夹处输入 cmd 进入命令控制 二. 在打开的cmd中输入‘conda install pymysql’ 三、输入y 安装完成~ 测试&#xff1a; import pandas as pd from sqlalchemy import create_engine …

EAM系统在地铁设备管理中的应用

在现代城市的交通系统中&#xff0c;地铁作为一种高效、快速、可靠的公共交通工具&#xff0c;扮演着至关重要的角色。为了确保地铁系统的正常运行和可靠性&#xff0c;地铁管理部门需要有效地管理大量的设备和设施。在这个过程中&#xff0c;企业资产管理&#xff08;EAM&…

Python个人代码随笔(观看无益,请跳过)

异常抛错&#xff1a;一般来说&#xff0c;在程序中&#xff0c;遇到异常时&#xff0c;会从这一层逐层往外抛错&#xff0c;一直抛到最外层&#xff0c;由最外层把错误显示在用户终端。 try:raise ValueError("A value error...") except ValueError:print("V…

MVC框架和Spring MVC的基本流程

MVC&#xff08;Model-View-Controller&#xff09;是一种设计模式&#xff0c;用于将应用程序的逻辑分离为三个不同的组件&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。MVC框架的原理是基于…

linux源码包管理

8.2 源码包管理 source code需要经过GC,C编译环境编译才能运行 ​ 可以设定个人设置&#xff0c;但配置复杂 ​ 软件包示例: nginx-1.8.1.tar.gz -----------------------------------------------------------------------------------------------------------------------…

企业与员工

相信大家最近都关注到了董宇辉这件事,在看“热闹”的同时,我们也要关注到事情的本质。最后回到根本,归根到底就是企业与员工。 在此之前,我们先一起回顾一下历史,当然,以下内容都是我根据老一辈的分享以及历史资料做出来的总结: 我们新中国成立,经历了很多事情,特别是…

Event Driven设计模式

EDA&#xff08;Event-Driven Architecture&#xff09;是一种实现组件之间松耦合、易扩展的架构方式。一个最简单的EDA设计需要包含如下几个组件&#xff1a; Events&#xff1a;需要被处理的数据。一个Event至少包含两个属性&#xff0c;类型和数据&#xff0c;类型决定了Eve…

知识付费小程序开发:构建个性化学习平台的技术实践

随着在线学习和知识付费的兴起&#xff0c;开发一款知识付费小程序成为了创新的热点之一。本文将通过使用Node.js、Express和MongoDB为例&#xff0c;演示如何构建一个基础的知识付费小程序后端&#xff0c;并实现用户认证和知识内容管理。 1. 初始化项目 首先&#xff0c;确…

CSS复合选择器(在基础选择器上元素选择的方式不同)

后代选择器&#xff1a; ------------ 此情况下&#xff0c;红色的可以划去 子&#xff08;元素&#xff09;选择器&#xff1a; 并集选择器&#xff1a; 伪类选择器&#xff1a; 如放上字符会变色。 链接伪类选择器&#xff1a; foucus伪类选择器&#xff1a;

matplotlib如何在label中加入字符并换行【已解决】

最近在跑一个超参数的实验&#xff0c;但是发现x轴的刻度就很丑 显然&#xff0c;lr和theta在一行显得很冗余 这个是此时的label x_labels [$\t{lr0.05}\ \tθ10}$, 40, 60] 正常加换行符即可&#xff0c;但是要加上$$ x_labels [$\t{lr0.05}\ $\n$ \tθ10}$, 40, 60] 大…

听力健康“吃”出来

大多数的研究报告都指出&#xff0c;听力下降的最常见原因是年龄和噪音暴露。然而&#xff0c;近年来越来越多的文章开始探讨其他因素对听力的影响。食物不仅是维持人类基本生存的必需品&#xff0c;随着营养学的进步&#xff0c;人们也逐渐认识到食物中的营养与保持健康之间存…

zabbix6入门到精通(3) 预处理

zabbix6入门到精通&#xff08;3&#xff09; 预处理 配置 — 主机 文件系统主项目 vfs.fs.get 测试一下 添加预处理 $[?(.fsname ‘/’)] $[0].inodes.pfree JSONPath参照&#xff1a; https://www.zabbix.com/documentation/6.0/zh/manual/config/items/preprocessi…

多线程中的单例模式

单线程中的单例模式 在单线程中&#xff0c;实现一个单例模式是简单的&#xff1a; class Singleton { public:static Singleton* get_instance() {if (instance_ nullptr) {instance_ new Singleton();}return instance_;}private:Singleton() default;static Singleton*…

【halcon深度学习】目标检测的数据准备过程中的一个库函数determine_dl_model_detection_param

determine_dl_model_detection_param “determine_dl_model_detection_param” 直译为 “确定深度学习模型检测参数”。 这个过程会自动针对给定数据集估算模型的某些高级参数&#xff0c;强烈建议使用这一过程来优化训练和推断性能。 过程签名 determine_dl_model_detection…

Codeforces Round 914 (Div. 2) A~E

A.Forked!&#xff08;思维&#xff09; 题意&#xff1a; 给出骑士的跳跃能力 ( x , y ) (x, y) (x,y) 以及国王和皇后的位置&#xff0c;问有多少个位置可以让骑士可以直接攻击到国王和皇后。 分析&#xff1a; 棋盘非常大 ( 1 0 8 1 0 8 ) (10^{8} \times 10^{8}) (1…

Tomcat-指定启动jdk、修改使用的jdk版本

修改tomcat配置文件setclasspath.sh 配置文件首行增加以下代码&#xff0c;指定启动的jdk&#xff1a; export JAVA_HOME/opt/softwares/jdk1.8.0_211/ export JRE_HOME/opt/softwares/jdk1.8.0_211/jre

力扣labuladong——一刷day75

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣200. 岛屿数量&#xff08;广搜&#xff09;二、力扣200. 岛屿数量&#xff08;深搜&#xff09; 前言 图论&#xff0c;深搜还有广搜都只是手段 一、…

某保险公司持续信赖监控易:优化网络运维,确保业务稳定

一、背景介绍 某保险有限公司&#xff0c;作为一家全国知名的保险公司&#xff0c;始终以科技创新和优质服务为引领&#xff0c;不断优化其业务运营。随着业务的快速发展&#xff0c;其IT系统规模日益庞大&#xff0c;网络运维压力也随之增大。为了提高IT系统的稳定性和可靠性&…