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

python 2 类与对象相关推荐

  1. Python基础(类与对象)

    Python基础(类与对象) 一.编程的两大思想 面向过程和面向对象 面向过程 面向对象 区别 事物比较简单,可以用线性的思维去解决 事物比较复杂,使用简单的线性思维无法解决 共同点:面向对象和面向过 ...

  2. Python基础——类与对象

    Python基础--类与对象 Python基础--类与对象 类与对象 数据类型 对象 类的创建 创建语法 类的创建 对象的创建 对象调用类中的内容 类属性,类方法,静态方法 类属性 访问类属性 类方法 ...

  3. Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法

    Day09新手小白学python 第九节 Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法 目录 Day09新手小白学python 前言 一.面向对象介绍 二 ...

  4. python的类和对象_Python类与对象实验

    一.任务描述 本实验任务主要对Python类与对象进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python类与对象的关系,并对Python类与对象的基本操作进行整理并填写工作任务报告. 二. ...

  5. Python的零基础超详细讲解(第十三天)-Python的类与对象

    基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...

  6. Python进阶-----类、对象的相关知识

    一.声明类 class 类名: #一般类名的首字母大写 '类的文档字符串' 类体 例如创建一个中国人的类: 1 class Chinese: 2 '这是一个中国人的类' #类的文档字符串 3 name ...

  7. python的类和对象——类的静态字段番外篇

    什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首 ...

  8. python 类-如何理解python的类与对象?

    挂一个自己的学习笔记 这个时间一长就搞错了,还经常回头来看一看,尤其是self的用法. python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也 ...

  9. 给Python的类和对象动态增加属性和方法

    通常我们会将编程语言分为静态和动态.静态语言的变量是在内存中的有类型的且不可变化的,除非强制转换它的类型:动态语言的变量是指向内存中的标签或者名称,其类型在代码运行过程中会根据实际的值而定.Pytho ...

  10. 【Python】Python的类和对象(长文系列第⑤篇)

    系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向"对象& ...

最新文章

  1. 一个效率更高的全半角字符串截取函数
  2. 给初学编程的人的干货
  3. Spring 中的代理选择原则
  4. vue vue的table表格自适应_vue table autoHeight(vue 表格自动高度)
  5. Linux入门-第五周
  6. Postgres无法连接到服务器
  7. 其六,函数之一Function
  8. MySQL 事务的实现原理,写得太好了!
  9. 通信原理第三章 模拟调制系统
  10. 国内外IGS数据及产品下载网站
  11. 电子政务工程建设项目可行性研究报告编制要求
  12. 什么是数据中台,让企业的数据作为生产资料转变为数据生产力
  13. 百度编辑器ueditor表格无法显示边框以及边框颜色等系列问题解决方案
  14. mysql创建管理员账户
  15. 2021-10-11 今日总结
  16. 购物车的实现——淘淘商城(二十六)
  17. MATLAB中输出直观公式
  18. 20189200余超 2018-2019-2 移动平台应用开发实践第六周作业
  19. 阿里云ACP云计算工程师认证攻略--转载
  20. CG-23H 超声波风速风向传感器--易风(加热型)

热门文章

  1. 100. Same Tree
  2. underscorejs-groupBy学习
  3. Java反射机制的使用方法
  4. 2010年亚运会前广州将大力推广清洁能源公交
  5. Node --- EventProxy的原理
  6. 【HDOJ】1597 find the nth digit
  7. Orchard架构介绍
  8. 日志文件在VS中输出为乱码问题
  9. 现代制造工程——第七章(轧制和锻造)
  10. 学习笔记(04):Python网络编程并发编程-什么是socket