面向对象进阶版!从入门到大牛!Python就是这么牛逼!

定义类

在 Python 中,类的定义使用 class 关键字来实现,语法如下:

class ClassName:
 '''类的帮助信息''' # 类文档字符串
 statement # 类体

参数说明:

  • ClassName :用于指定类名,一般使用大写字母开头,如果类名中包括两个单词,第二个单词的首字母也大写,这种命名方法也称为“驼峰式命名法”,这是惯例。当然,也可根据自己的习惯命名,但是一般推荐按照惯例来命名。
  • statement :类体,主要由类变量(或类成员)、方法属性等定义语句组成。如果在定义类时,没想好类的具体功能,也可以在类体中直接使用 pass 语句代替。
  • 例如,下面以大雁为例声明一个类,代码如下:
class Animal:
 '''动物类'''
 pass

创建类的实例

class 语句本身并不创建该类的任何实例。所以在类定义完成以后,可以创建类的实例,即实例化该类的对象。创建类的实例的语法如下:

进群:548377875   即可获取数十套PDF哦!

ClassName(parameterlist)

例如,创建Geese 类的实例,可以使用下面的代码

wildGoose = Animal() # 创建动物类的实例
print(wildGoose) # 输出实例

执行上面代码后,将显示类似下面的内容

<__main__.Animal object at0x0000000002F47AC8>

从上面的执行结果中可以看出, wildGoose 是 Geese 类的实例。

创建类的方法

 类中的方法函数非常相似,可以理解为方法是在类中定义的函数。创建方法和创建函数类似,语法格式如下:
def functionName(self,parameterlist):
 block

参数说明如下:

  • functionName:用于指定方法名,一般使用小写字母开头;
  • self:必要参数,表示类的实例,其名称可以是self以外的单词,使用self只是一个惯例而已;
  • parameterlist:用于指定除self参数以外的参数,各参数间使用逗号“,”进行分隔;
  • block:方法体,实现的具体功能
说明:实例方法和Python中的函数的主要区别就是,函数实现的是某个独立的功能,而实例方法是实现类中的一个行为,是类的一部分。

实例方法创建完成后,可以通过类的实例名称和点(.)操作符进行访问。具体的语法格式如下:

instanceName.functionName(parametervalue)

创建一个Animal类,并定义eat()、play()和sleep()3个方法。实例化Animal类,并调用这3个方法。下面看一段示例代码

class Animal: # 创建动物类
 '''动物类'''
 def eat(self): # 定义吃食物方法
 print('正在吃食物')
 def play(self): # 定义玩耍方法
 print('正在玩耍')
 def sleep(self): # 定义休息方法
 print('正在休息')
Dog = Animal() # 创建动物类的实例
Dog.eat() # 调用吃食物的方法
Dog.play() # 调用玩耍的方法
Dog.sleep() # 调用休息的方法

运行结果如下所示。

正在吃食物
正在玩耍
正在休息

创建__init__()方法

在创建类后,通常会创建一个__init__()方法。该方法一个特殊的方法,类似Java语言中的构造方法。每当创建一个类的新实例时,Python都会自动执行它。__init__()方法必须包含一个self参数,并且必须是第一个参数。self参数是一个指向实例本身的引用,用于访问类中的属性方法。在方法调用时会自动传递实际参数self。因此,当__init__()方法只有一个参数时,在创建类的实例时,就不需要指定实际参数了。

说明:在__init__()方法名称中,开头和结尾处是两个下划线(中间没有空格),这是一种约定,旨在区分Python方法普通方法。下面仍然以大雁为例声明一个类,并且创建__init__()方法,下面看一段示例代码
class Animal: # 创建动物类
 '''大雁类'''
 def __init__(self):
 print('这是一个动物类')
 def eat(self): # 定义吃食物方法
 print('正在吃食物')
 def play(self): # 定义玩耍方法
 print('正在玩耍')
 def sleep(self): # 定义休息方法
 print('正在大雁休息')
Dog = Animal() # 创建动物类的实例
Dog.eat() # 调用吃食物的方法
Dog.play() # 调用玩耍的方法
Dog.sleep() # 调用休息的方法

运行结果如下所示。

这是一个动物类
正在吃食物
正在玩耍
正在大雁休息

从上面的运行结果可以看出,在创建大雁类的实例时,虽然没有为__init__()方法指定参数,但是该方法自动执行。

__init__()方法中,除了self参数外,还可以自定义一些参数,参数间使用逗号“,”进行分隔。例如,下面的代码将在创建__init__()方法时,再指定3个参数,分别是name、gender和weight。

class Animal: # 创建动物类
 '''动物类'''
 def __init__(self,name,gender,weight):
 '''初始化赋值'''
 self.name = name
 self.gender = gender
 self.weight = weight
 def info(self):
 '''输出基本信息'''
 if self.gender == 'male':
 print('这只%s是公的' % self.name)
 else :
 print('这只%s是母的' % self.name)
 print('%s的重量是%s千克' % (self.name,self.weight))
dog = Animal('腊肠狗','male',10) # 创建动物类的实例
dog.info() # 调用实例的info方法输出基本信息
cat = Animal('波斯猫','female',5) # 创建动物类的实例
cat.info() # 调用实例的info方法输出基本信息

执行上面的代码,运行结果如下:

这只腊肠狗是公的
腊肠狗的重量是10千克
这只波斯猫是母的
波斯猫的重量是5千克
 上述代码中,__init__()方法的参数包含新创建的实例self和在调用类对象时提供的参数。在__init__()内,通过将属性分配给self来将其保存到实例中。例如,self.name = name表示将name属性保存在实例中。在新创建的实例返回到goods_a和goods_b后,使用点号(.)运算符即可访问这些属性以及类的属性。如goods_a.info()。点号(.)运算符属于属性绑定。访问属性时,首先会检查实例,如果不知道该属性的任何信息,则会对实例的类进行搜索。这是因为类和其所有实例共享其属性的底层机制。

常见错误:在为类创建__init__()方法时,在开发环境中运行下面代码

class Animal:
 '''动物类'''
 def __init__(): # 构造方法
 print("这是动物类!")
dog = Animal()# 创建动物类的实例

显示如下所示的异常信息。该错误解决方法是在第3行代码的括号中添加self。

Traceback (most recent call last):
 File "test.py",line 6,in 
 dog = Animal()# 创建动物类的实例
TypeError: __init__() takes 0 positional arguments but 1 was given

self的作用

在编写类方法时,必须多加一个self在参数列表开头,但是我们却没有为这个参数赋值,那么这个self的作用是什么呢?其实,self是一种特定的变量,它引用的是对象本身。按照惯例,它被赋予self这一名称。当然也可以使用其他的名字,但是强烈推荐使用self这一名称,因为任何一个程序员都可以一眼认出它。

那么 Python 是如何给 self 赋值的?我们依然以动物类为例。在Animal类创建了2个实例dog和cat 。当调用这个对象的方法,如 dog.info()时,Python将会自动将其转换成Animal.info(dog) 。同理,当调用cat.info()时,Python将会自动将其转换成Animal.info(cat) 。如果info()函数还有参数,例如:

def info(self,arg1,arg2):
 pass

那么调用dog.info(arg1,arg2)时,Python将会自动将其转换成Animal.info(dog,arg2) 。

属性和实例属性

前面介绍了类中的方法,本节来介绍一下类中的另一个成员——属性。所谓的属性,可以理解为在类中定义的变量。根据定义位置,又可以分为类属性和实例属性

1.类属性

属性是指定义在类中,并且在函数体外的属性。类属性可以在类的所有实例之间共享值,也就是在所有实例化的对象中公用。

例如,定义一个Animal类,然后定义1个类属性代码如下:

class Animal:
 age = 5

可以通过2种方式来调用属性:类名.属性名和实例名.属性名。例如:

class Animal:
 age = 5
print(Animal.age)# 类名调用属性输出结果为 5
dog =Animal()# 实例化Animal类
print(dog.age)# 实例名调用属性,输出结果为 5
cat =Animal()# 实例化Animal类
print(cat.age)# 实例名调用属性,输出结果为 5

上述代码中,Animal类有一个属性age,所以Animal.age的值为5。但是Animal的2个实例dog和cat为什么也能够获取age属性呢?这就是属性继承搜索功能。下面的类树图可以很好的解释这个问题。

面向对象进阶版!从入门到大牛!Python就是这么牛逼!

上图中,Animal类有一个属性age,并且通过Animal类创建了2个实例dog和cat。当调用dog.age时,由于age实例的age属性不存在,所以会继续向上搜索到Animal,发现Animal类中有age属性,所以,dog.age为5。

注意:如果调用dog.name,由于age实例和Animal类都没有这个属性,所以提示如下错误信息:AttributeError:'Animal' object has no attribute 'name'

创建一个Animal类,该类有一个属性age,并创建2个实例dog和cat,如果更改Animal类age属性的初始值,那么,dog.age和cat.age是否会发生变化呢?下面通过一个例子来学习一下。

class Animal:
 age = 5
dog = Animal() # 实例化Animal类
cat = Animal() # 实例化Animal类
dog.age = 10
Animal.age = 8
print('Animal类的age属性值为%s' % Animal.age) # 类名调用属性输出结果为 8
print('dog实例的age属性值为%s' % dog.age) # 实例名调用属性,输出结果为 10
print('cat实例的age属性值为%s' % cat.age) # 实例名调用属性,输出结果为 8

运行结果如下。

Animal类的age属性值为8
dog实例的age属性值为10
cat实例的age属性值为8

上述代码中,对于dog实例,动态为其添加属性age,dog.age在查找时,优先查找dog实例的age,所以结果为10。接下来,动态更改Animal类的age属性值,所以Animal.age的值变为8。而由于cat实例没有age属性,所以向上查找Animal类的属性,此时,由于Animal的age属性值已经变为8,所以cat.age为8。通过下图可以更好理解赋值过程。

面向对象进阶版!从入门到大牛!Python就是这么牛逼!

2.实例属性

实例属性是指定义在类的方法中的属性,只作用于当前实例中。在18.2.4节创建__init__()方法时,就使用了实例属性

创建一个Animal类,该类中有3个方法__init__()初始化方法,info()输出详细信息方法以及get_gender()判断动物性别的方法

__init__()初始化方法中,使用self.name、self.gender和self.weight设置实例属性

class Animal: # 创建动物类
 '''动物类'''
 def __init__(self,weight):
 '''初始化赋值'''
 self.name = name
 self.gender = gender
 self.weight = weight
 def info(self):
 '''输出基本信息'''
 gender = self.get_gender(self.gender)
 print('这只%s%s的' % (self.name,gender))
 print('%s的重量是%s千克' % (self.name,self.weight))
 def get_gender(self,gender):
 '''判断动物的性别'''
 if self.gender == 'male':
 gender = '公'
 else :
 gender = '母'
 return gender
dog = Animal('腊肠狗',5) # 创建动物类的实例
cat.info() # 调用实例的info方法输出基本信息

运行结果如下所示。

这只腊肠狗是公的
腊肠狗的重量是10千克
这只波斯猫是母的
波斯猫的重量是5千克

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实