python 2 类与对象

1、类与对象的概念

类即类别、种类,是面向对象设计最重要的概念,从一小节我们得知对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体。

那么问题来了,先有的一个个具体存在的对象(比如一个具体存在的人),还是先有的人类这个概念,这个问题需要分两种情况去看

(1)在现实世界中:肯定是先有对象,再有类世界上肯定是先出现各种各样的实际存在的物体,然后随着人类文明的发展,人类站在不同的角度总结出了不同的种类,比如

人类、动物类、植物类等概念。也就说,对象是具体的存在,而类仅仅只是一个概念,并不真实存在,比如你无法告诉我人类具体指的是哪一个人。

(2)在程序中:务必保证先定义类,后产生对象

这与函数的使用是类似的:先定义函数,后调用函数,类也是一样的:在程序中需要先定义类,后调用类。不一样的是:调用

函数会执行函数体代码返回的是函数体执行的结果,而调用类会产生对象,返回的是对象

 

1>把一类事物的静态属性和动态可以执行的操作组合在一起所得到的这个概念就是类 
2>类的一个个体就是对象,对象是具体的,实实在在的事物 
3>对象是特征与技能的结合体,其中特征和技能分别对应对象的数据属性和方法属性 
4>对象(实例)本身只有数据属性,但是python的class机制会将类的函数绑定到对象上,称为对象的方法,或者叫绑定方法,绑定方法唯一绑定一个对象,同一个类的方法绑定到不同的对象上,属于不同的方法,内存地址都不会一样 
在类内部定义的属性属于类本身的,由操作系统只分配一块内存空间,大家公用这一块内存空间 
5>创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性:而类中有两种属性:数据属性和函数属性,其中类的数据属性是共享给所有对象的,而类的函数属性是绑定到所有对象的。 
6>创建一个对象(实例)就会创建一个对象(实例)的名称空间,存放对象(实例)的名字,称为对象(实例)的属性 
7>在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类…最后都找不到就抛出异常。 
8>类的相关方法:类的相关方法(定义一个类,也会产生自己的名称空间)
类名.__name__   # 类的名字(字符串)
类名.__doc__    # 类的文档字符串
类名.__base__   # 类的第一个父类(在讲继承时会讲)
类名.__bases__  # 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__   # 类的字典属性、名称空间
类名.__module__ # 类定义所在的模块
类名.__class__  # 实例对应的类(仅新式类中)1.创建出类会产生名称空间,实例化对象也会产生名称空间。2.用户自己定义的一个类,实际上就是定义了一个类型,类型与类是统一的。3.用户先是从自己的命名空间找,如果找不大,在从类的命名空间找。student1.langage = "1111"print(student1.__dict__)  ===>先是从自己的命名空间找print(Student.__dict__)   ===>然后在从类的命名空间找4.通过类来访问,访问的是函数,通过对象来访问,访问的是方法,在类内部定义的方式实际上是绑定到对象的身上来用的。
<function Student.fun at 0x000000000267DAE8>
<bound method Student.fun of <__main__.Student object at 0x0000000002684128>><function Student.fun at 0x00000000025CDAE8>
<bound method Student.fun of <__main__.Student object at 0x00000000025D4160>>
<bound method Student.fun of <__main__.Student object at 0x00000000025D4198>>5.总结:类的数据属性是大家共有的,而且大家的内部地址是一样的,用的就是一个类的函数属性是绑定到大家身上的,内部地址不一样,绑定方法指的是绑定到对象身上。绑定方法:绑定到谁的身上,就是给谁用的,谁来调用就会自动把自己当做第一个参数传入。**定义在类内部的变量,是所有对象共有的,id全一样,**定义在类内部的函数,是绑定到所有对象的,是给对象来用的,obj.fun()会把obj本身当做一个参数来传递。6.在类内部定义的函数虽然可以由类来调用,但是并不是为了给类用的,在类内部定义的函数的目的就是为了绑定到对象身上的。7.在类的内部来说,__init__是类的函数属性,但是对于对象来说,就是绑定方法。8.命名空间的问题:先从对象的命名空间找,随后在从类的命名空间找,随后在从父类的命名
空间找。
print(student1.x)9.在定义类的时候,可以想什么先写什么。

2、定义类

按照上述步骤,我们来定义一个类

(1)在现实世界中,先有对象,再有类

对象1:李坦克特征:学校=oldboy姓名=李坦克性别=男年龄=18技能:学习吃饭睡觉对象2:王大炮特征:学校=oldboy姓名=王大炮性别=女年龄=38技能:学习吃饭睡觉对象3:牛榴弹特征:学校=oldboy姓名=牛榴弹性别=男年龄=78技能:学习吃饭睡觉
 

(2)在程序中,必须先定义类,后使用类(用来产生对象)

#在Python中程序中的类用class关键字定义,而在程序中特征用变量标识,技能用函数标识,因而类中最常见的无非是:变量和函数的定义

# 先定义类
class OldboyStudent:school='oldboy'def learn(self):print('is learning')def eat(self):print('is eating')def sleep(self):print('is sleeping')
# 后产生对象
stu1 = OldboyStudent()
stu2 = OldboyStudent()
stu3 = OldboyStudent()
print(stu1)
print(stu2)
print(stu3)


  •  

  • 类中可以有任意python代码,这些代码在类定义阶段便会执行,因而会产生新的名称空间,用来存放类的变量名与函数名,可以通过OldboyStudent.__dict__查看
  • 类中定义的名字,都是类的属性,点是访问属性的语法
  • 对于经典类来说我们可以通过该字典操作类名称空间的名字,但新式类有限制(新式类与经典类的区别我们将在后续章节介绍

3、类的使用

3.1、引用类的属性

 

class OldboyStudent:
school='oldboy'
def learn(self):
print('is learning')

def eat(self):
print('is eating')

def sleep(self):
print('is sleeping')
# 后产生对象
stu1 = OldboyStudent()
stu2 = OldboyStudent()
stu3 = OldboyStudent()
print(stu1)
print(stu2)
print(stu3)


print(OldboyStudent.school) #查 输出结果:oldboy

OldboyStudent.school='Oldboy2' #改
print(OldboyStudent.school)# 输出结果:Oldboy2

OldboyStudent.x=1 #增
print(OldboyStudent.x) #输出结果 1

del OldboyStudent.x #删
print(OldboyStudent.x)
输出结果:
AttributeError: type object 'OldboyStudent' has no attribute 'x'



3.2、调用类,或称为实例化,得到程序中的对象

stu1 = OldboyStudent()
stu2 = OldboyStudent()
stu3 = OldboyStudent()
#如此,s1、s2、s3都一样了,而这三者除了相似的属性之外还各种不同的属性,这就用到了__init__
__init__方法 # 用来为对象定制自己独特的属性
#注意:该方法是在对象产生之后才会执行,只用来为对象进行初始化操作,可以有任意代码,但一定不能有返回值
class OldboyStudent:......def __init__(self,name,age,sex):self.name=nameself.sex=sexself.age=age......s1=OldboyStudent('李坦克','',18) #先调用类产生空对象s1,然后调用OldboyStudent.__init__(s1,'李坦克','男',18)
s2=OldboyStudent('王大炮','',38)
s3=OldboyStudent('牛榴弹','',78)

4、对象的使用

class OldboyStudent:school = 'oldboy'def __init__(self,name,sex,age):self.name=nameself.sex=sexself.age = agedef learn(self):print('is learning')def eat(self):print('is eating')def sleep(self):print('is sleeping')s1=OldboyStudent('李坦克','',18) #先调用类产生空对象s1,然后调用OldboyStudent.__init__(s1,'李坦克','男',18)
s2=OldboyStudent('王大炮','',38)
s3=OldboyStudent('牛榴弹','',78)
print(s1.__dict__)
print(s2.__dict__)
print(s3.__dict__)结果:
{'name': '李坦克', 'sex': '', 'age': 18}
{'name': '王大炮', 'sex': '', 'age': 38}
{'name': '牛榴弹', 'sex': '', 'age': 78}

 

#执行__init__,s1.name='牛榴弹',很明显也会产生对象的名称空间可以用s2.__dict__查看,查看结果为
{'name': '王大炮', 'age': '', 'sex': 38}s2.name #查,等同于s2.__dict__['name']
s2.name='王三炮' #改,等同于s2.__dict__['name']='王三炮'
s2.course='python' #增,等同于s2.__dict__['course']='python'
del s2.course #删,等同于s2.__dict__.pop('course')

5、补充说明

  • 站的角度不同,定义出的类是截然不同的;
  • 现实中的类并不完全等于程序中的类,比如现实中的公司类,在程序中有时需要拆分成部门类,业务类等;
  • 有时为了编程需求,程序中也可能会定义现实中不存在的类,比如策略类,现实中并不存在,但是在程序中却是一个很常见的类。
 
 

 

转载于:https://www.cnblogs.com/foremostxl/p/9571782.html

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

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

相关文章

记录一下 Linux飞鸽传书 QIpMsg 的下载链接

linux下的iptux用来和windows下的飞秋通信很容易中断&#xff0c;不知道是我设置的问题&#xff0c;还是iptux自己的问题。。不想花时间找问题额 然后试了下飞鸽传书蛮好用 可以和windows下的飞秋和飞鸽通信的 记录一下&#xff0c;在这里下载的rpm包&#xff1a; http://www.o…

android 图片存sd卡上,android打开,保存图片到sd卡,显示图片

1.打开根目录下test.jpgBitmap bm BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath()"/test.jpg");int[] pixels new int[bm.getWidth()*bm.getHeight()];bm.getPixels (pixels,0,bm.getWidth(),0,0,bm.getWidth(),bm.getHei…

全国计算机等级考试题库二级C操作题100套(第66套)

第66套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;将形参std所指结构体数组中年龄最大者的数据作为函数值返回&#xff0c;并在main函数中输出。请在程序的下划线处填入正确的内容并把下划线删除&#xff0c;使程序得出正确的结 果。 注意&#xff1a;源…

python括号匹配问题_支持通配符的括号匹配问题源码+详细流程代码(python)

问题&#xff1a;判断一个有左括号和右括号、以及其他ASCII字符组成的表达式是合法。 判断条件是左括号-右括号数目、次序配对&#xff0c;可多层嵌套。如果有*&#xff0c;则*可作为0个或者1个右括号&#xff0c;如果匹配则输出ok,不匹配则输出不匹配字符所在字符串中的具体位…

编译选项—微软官方+各地总结

优化选项用途/O1创建小代码。/O2创建快速代码。/Ob控制内联展开。/Od禁用优化。/Og使用全局优化。/Oi生成内部函数。/Os代码大小优先。/Ot代码速度优先。/Ox使用最大优化 (/Ob2gity /Gs)。/Oy省略帧指针。 (仅限 x86)代码生成选项用途/arch使用 SSE 或 SSE2 指令生成代码。 (仅…

(原创)让mongodb的secondary支持读操作

对于replica set 中的secondary 节点默认是不可读的。在写多读少的应用中&#xff0c;使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk&#xff0c;由Secondary来分担读的压力&#xff0c;Primary只承担写操作。如果通过shell访问mongo&#xff0c;要在…

全国计算机等级考试题库二级C操作题100套(第67套)

第67套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;调用随机函数产生20个互不相同的整数放在形参a所指数组中&#xff08;此数组在主函数中已置0&#xff09;。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。 注意&#xff1a…

mx4 pro 刷 原生 android,魅族MX4 Pro怎么刷机?通用刷机和固件升级教程

魅族MX4 Pro是一款性价比很高的手机&#xff0c;使用这款手机的用户也非常多。不过在魅族MX4 Pro的使用过程中&#xff0c;难免会出现系统方面的问题&#xff0c;又或者官方发布了新的固件升级包&#xff0c;这个时候就需要通过刷机的方法来解决问题或者升级魅族MX4 Pro固件。在…

python dataframe 查看为空值_Python pandas.DataFrame 找出有空值的行

0.摘要pandas中DataFrame类型中&#xff0c;找出所有有空值的行&#xff0c;可以使用.isnull()方法和.any()方法。1.找出含有空值的行方法&#xff1a;DataFrame[DataFrame.isnull().T.any()]其中&#xff0c;isnull()能够判断数据中元素是否为空值&#xff1b;T为转置&#xf…

#linux# su命令细节错误

2019独角兽企业重金招聘Python工程师标准>>> #前言# 在学习su命令时&#xff0c;几乎所有的国内书籍都说是切换用户功能。今天在linux系统下想开启httpd&#xff08;即Apache服务器&#xff09;&#xff0c;输入指令<code>service httpd start</code>结…

ASP.NET MVC5+EF6+EasyUI 后台管理系统(92)-打印EasyUI 的datagrid表格

前言 应用系统有时候需要打印Datagrid的表格内容&#xff0c;我们本节就来学习打印datagrid内容 打印主要使用&#xff1a;web打印&#xff08;我们之前有讲过web打印插件jqprint&#xff09; 将datagrid重新编制成可以打印的html格式 一、建立一个普通的例子 我们使用官方下载…

全国计算机等级考试题库二级C操作题100套(第68套)

第68套&#xff1a; 给定程序中&#xff0c;函数fun的功能是:求ss所指字符串数组中长度最长的字符串所 在的行下标,作为函数值返回&#xff0c;并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串&#xff0c;且串长<N。 请在程序的下划线处填入正确的内容并…

速读训练软件_记忆宫殿记忆力训练教程-第八天

第四部分 右脑开发及训练前面我们已经知道了右脑的记忆能力是左脑的100万倍&#xff0c;这可不是个小数字&#xff0c;如果我们能利用右脑来处理眼睛所收集到的信息&#xff0c;我们的记忆能力就会达到每分钟数万字的超级速度右脑不同于左脑的四种能力为&#xff1a;1、共振能力…

uniapp背景图片android不显示,uni-app网络图片在app不显示,小程序显示

引用的网络图片&#xff0c;ios显示空白&#xff0c;banner自动切换的图片content:,state:0,imgUrls: ["https://m.360buyimg.com/n12/jfs/t11317/108/1080677336/325163/f4c2a03a/59fd8b17Nbe2fcca3.jpg!q70.jpg","https://m.360buyimg.com/n12/jfs/t11575/282…

Razor语法

原文 http://www.cnblogs.com/lmfeng/archive/2013/03/28/2986073.html Razor语法概要&#xff1a; 1、Razor是以为标识符 2、是以{}作为作用域的标识 3、可以按照一定规则将HTML和C#混合编写 4、若输出要使用进行转义 { Layout "~/_SiteLayout.cshtml"; Page.Titl…

mysql 随机选取一条记录

要从tablename表中随机提取一条记录&#xff0c;大家一般的写法就是&#xff1a;SELECT * FROM tablename ORDER BY RAND() LIMIT 1。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 mysql> SELECT RAND(); ------------------- |…

全国计算机等级考试题库二级C操作题100套(第69套)

第69套&#xff1a; 给定程序中&#xff0c;函数fun的功能是将a和b所指的两个字符串转换成面值相同的整数&#xff0c;并进行相加作为函数值返回&#xff0c;规定字符串中只含9个以下数字字符。 例如&#xff0c;主函数中输入字符串&#xff1a;32486和12345&#xff0c;在主函…

python去除图片上的文字_Python图像处理之识别图像中的文字(实例讲解)

①安装PIL&#xff1a;pip install Pillow(之前的博客中有写过)②安装pytesser3&#xff1a;pip install pytesser3③安装pytesseract&#xff1a;pip install pytesseract④安装autopy3&#xff1a;先安装wheel&#xff1a;pip install wheel下载autopy3-0.51.1-cp36-cp36m-wi…

android基于蓝牙实验,基于Android智能蓝牙的血糖实时监测系统的设计与实现

摘要&#xff1a;糖尿病是目前严重危害人类健康的一种疾病,掌握血糖的变化是现阶段临床上预防和控制糖尿病最重要也是最有效的方法。目前市场上已有的血糖仪大部分是以电化学方法为基础,将检测结果保存到检测仪器中,不利于对数据进行相关分析。论文基于嵌入式检测技术与Android…

[Vue]组件——通过$emit为组件自定义事件

1.在定义组件时调用内建的 $emit 方法并传入事件的名字&#xff0c;来向父级组件触发一个事件enlarge-text&#xff1a; Vue.component(blog-post, {props: [post],template: <div class"blog-post"><h3>{{ post.title }}</h3><button v-on:cli…