- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章简述 Python 的类和对象由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向“对象”编程这类段子,而面向对象编程的语言都会有三大特征:封装、继承、多态.
我们平时接触到的很多函数、方法的操作都具有这些性质,我们只是会用,但还没有去深入了解它的本质,下面就介绍一下关于类和对象的相关知识.
封装 。
封装这个概念应该并不陌生,比如我们把一些数据封装成一个列表,这就属于数据封装,我们也可以将一些代码语句封装成一个函数方便调用,这就是代码的封装,我们也可以将数据和代码封装在一起。用术语表示的话,就是可以将属性和方法进行封装,从而得到对象.
首先我们可以定义一个类,这个类中有属性和方法,但有的伙伴会比较好奇,属性和方法不是会封装成对象嘛,为什么又变成类了?举个例子,类就好比是一个毛坯房,而对象是在毛坯房的基础上改造成的精装房.
1
2
3
4
5
6
7
8
9
10
|
class
XiaoMing:
#属性
height
=
180
weight
=
65
sex
=
'男'
#方法
def
run(
self
):
print
(
'小明在跑步'
)
def
sleep(
self
):
print
(
'小明在睡觉'
)
|
在类定义完成时就创建了一个类对象,它是对类定义创建的命名空间进行了一个包装。类对象支持两种操作:属性引用和实例化.
属性引用的语法就是一般的标准语法:obj.name。比如XiaoMing.height和XiaoMing.run就是属性引用,前者会返回一条数据,而后者会返回一个方法对象.
1
2
3
4
5
|
In[
1
]:
print
(XiaoMing.height)
Out[
1
]:
180
In[
2
]:
print
(XiaoMing.run)
Out[
2
]:<function XiaoMing.run at
0x0000021C6239D0D0
>
|
这里也支持对类属性进行赋值操作,比如为类中的weight属性赋予一个新值.
1
2
3
4
5
6
|
In[
3
]:
print
(XiaoMing.weight)
Out[
3
]:
65
In[
4
]:XiaoMing.weight
=
100
In[
5
]:
print
(XiaoMing.weight)
Out[
5
]:
100
|
而类的实例化可以将类对象看作成一个无参函数的赋值给一个局部变量,如下:
1
|
In[
6
]:ming
=
XiaoMing()
|
ming就是由类对象实例化后创建的一个实例对象,通过实例对象也可以调用类中的属性和方法.
1
2
3
4
5
6
7
8
|
In[
7
]:ming.run()
Out[
7
]:小明在跑步
In[
8
]:
print
(xiaoming.height)
Out[
8
]:
180
#通过向类对象调用方法返回的方法对象中传入实例对象也可以达到同样效果
In[
11
]:XiaoMing.run(ming)
Out[
11
]:小明在跑步
|
魔法方法__init__ 。
类在实例化过程中并不都是像上面例子一样简单的,一般类都会倾向将实例对象创建为有初始状态的,所以在类中可能会定义一个__init__的魔法方法,这个方法就可以帮助接收、传入参数.
而一个类如果定义了__init__方法,那么在类对象实例化的过程中就会自动为新创建的实例化对象调用__init__方法,请看下面这个例子.
1
2
3
4
5
6
|
class
Coordinates:
def
__init__(
self
,x,y):
self
.x
=
x
self
.y
=
y
def
print_coor(
self
):
print
(
'当前坐标为(%s,%s)'
%
(
self
.x,
self
.y))
|
可以看到在__init__()中传入了参数x和y,然后在print_coor中需要接收参数x和y,接下来通过实例化这个类对象,验证一下参数是否能通过__init__()传递到类的实例化操作中.
1
2
3
4
|
In[
9
]:coor
=
Coordinates(
5
,
3
)
In[
10
]:coor.print_coor()
Out[
10
]:当前坐标为(
5
,
3
)
|
继承 。
所谓继承就是一个新类在另一个类的基础上构建而成,这个新类被称作子类或者派生类,而另一个类被称作父类、基类或者超类,而子类会继承父类中已有的一些属性和方法.
1
2
3
4
5
6
|
class
Mylist(
list
):
pass
list_
=
Mylist()
list_.append(
1
)
print
(list_)
''' [1] '''
|
比如上面这个例子,我并没有将list_定义成一个列表,但它却能调用append方法。原因是类Mylist继承于list这个基类,而list_又是Mylist的一个实例化对象,所以list_也会拥有父类list拥有的方法.
当然可以通过自定义类的形式实现两个类之间的继承关系,我们定义Parent和Child两个类,Child中没有任何属性和方法,只是继承于父类Parent.
1
2
3
4
5
6
7
8
9
10
|
class
Parent:
def
par(
self
):
print
(
'父类方法'
)
class
Child(Parent):
pass
child
=
Child()
child.par()
'''
父类方法
'''
|
覆盖 。
当子类中定义了与父类中同名的方法或者属性,则会自动覆盖父类对应的方法或属性,还是用上面这个例子实现一下,方便理解.
1
2
3
4
5
6
7
8
9
10
11
|
class
Parent:
def
par(
self
):
print
(
'父类方法'
)
class
Child(Parent):
def
par(
self
):
print
(
'子类方法'
)
child
=
Child()
child.par()
'''
子类方法
'''
|
可以看到子类Child中多了一个和父类Parent同名的方法,再实例化子类并调用这个方法时,最后调用的是子类中的方法。 Python中继承也允许多重继承,也就是说一个子类可以继承多个父类中的属性和方法,但是这类操作会导致代码混乱,所以大多数情况下不推荐使用,这里就不过多介绍了.
多态 。
多态比较简单,比如定义两个类,这两个类没有任何关系,只是两个类中有同名的方法,而当两个类的实例对象分别调用这个方法时,不同类的实例对象调用的方法也是不同的.
1
2
3
4
5
6
|
class
XiaoMing:
def
introduce(
self
):
print
(
"我是小明"
)
class
XiaoHong:
def
introduce(
self
):
print
(
"我是小红"
)
|
上面这两个类中都有introduce方法,我们可以实例化一下两个类,利用实例对象调用这个方法实现一下多态.
1
2
3
4
5
6
7
8
|
In[
12
]:ming
=
XiaoMing()
In[
13
]:hong
=
XiaoHong()
In[
14
]:ming.introduce()
Out[
14
]:我是小明
In[
15
]:hong.introduce()
Out[
15
]:我是小红
|
常用BIF 。
1、issubclass(class,classinfo) 。
判断一个类是否是另一个类的子类,如果是则返回True,反之则返回False.
1
2
3
4
5
6
7
8
|
class
Parent:
pass
class
Child(Parent):
pass
print
(
issubclass
(Child,Parent))
'''
True
'''
|
需要注意的有两点:
1
2
3
4
|
print
(
issubclass
(Parent,Parent))
'''
True
'''
|
2、isinstance(object,classinfo) 。
判断一个对象是否为一个类的实例对象,如果是则返回True,反之则返回False.
1
2
3
4
5
6
7
8
9
10
|
class
Parent:
pass
class
Child:
pass
p
=
Parent()
c
=
Child()
print
(
isinstance
(p,Parent,Child))
#True
print
(
isinstance
(c,Parent))
#False
|
需要注意的有两点:
3、hasattr(object,name) 。
判断一个实例对象中是否包含一个属性,如果是则返回True,反之则返回False.
1
2
3
4
5
6
7
|
class
Parent:
height
=
100
p
=
Parent()
print
(
hasattr
(p,
'height'
))
'''
True
'''
|
需要注意的是第二个参数name必须为字符串形式传入,如果不是则会返回False.
以上就是简述 Python 的类和对象的详细内容,更多关于Python 的类和对象的资料请关注我其它相关文章! 。
原文链接:https://mp.weixin.qq.com/s?__biz=MzA5OTIzNjE1NA==&mid=2247488172&idx=1&sn=9d32497231a26d8357a6d69e6c62cb36&utm_source=tuicool&utm_medium=referral 。
最后此篇关于简述 Python 的类和对象的文章就讲到这里了,如果你想了解更多关于简述 Python 的类和对象的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!