Python初识类与对象
Python初识类与对象
类与对象
世界观角度分析类与对象
类是一个抽象的概念,而对象是一个实体的存在,对象由类创造而出,每个对象之间互相独立互不影响,一个对象可以同时拥有多个类的方法,实例化就是通过某类创建对象的过程。
比如,某一个人是一个具体的对象,而人类则是人这个对象的来源,人类是一个抽象的概念并且人类又属于哺乳类,所以人也应该具有哺乳类的方法和行为(继承),每个人具有不同的样貌,声音及其自身的不同习惯(多态)。一只猴子不属于人类,因为他没有人类共有的属性和方法,比如:人没有尾巴,人会说话 等等。(封装)。
程序功能角度分析类与对象
从程序功能角度来看,类是其对象存放共有方法以及属性的地方。并不存在什么抽象不抽象,我一样可以用类来做很多事情。对象确实是由类产生的但是类也是一个对象,因为类它的确可以存放属性以及方法。
类与对象的关系就在于,类可以存放其实例化对象所需要用到的公共方法与属性,而实例化对象则可以具有类对象不具有的某些属性或方法。
类的定义
定义类发生的几件事:
1.申请内存空间保存类体代码
2.将上述内存地址绑定给类名
3.创建类专属的局部命名空间(注意与函数区分。函数是在执行阶段才会做这件事)
4.执行类体代码(注意与函数区分。函数的定义阶段不会执行其内部代码)

类的实例化
实例化类发生的几件事情:
1.调用执行类下的
__new__()方法进行类的实例化2.调用执行类下的
__init__()方法进行实例对象的构造3.创建实例对象独有的命名空间
class People(object): # <-- 类名:驼峰体, (继承类),可以写也可以不写,推荐写上。
"""这是人类""" # <-- 说明 number_of_eyes = 2 # 眼睛数量
number_of_mouths = 1 # 嘴巴数量
number_of_ears = 2 # 耳朵数量
number_of_noses = 1 # 鼻子数量 def __init__(self, name, color, height, weight): # 方法/功能
self.name = name # self ---> 实例化对象
self.color = color
self.height = height
self.weight = weight def speak(self, content): # 方法/功能
print("{0}说:{1}".format(self.name, content)) # ==== 实例化对象 ==== Ps:可以看到实例化出的对象内存地址完全不同。并且他们还具备了类本身不具备的某些属性,这些属性被称为实例属性 p1 = People("云崖", "黄色", 192, 158)
print(p1) # <__main__.People object at 0x00000183AECE3E80>
print(id(p1)) #
print(type(p1)) # <class '__main__.People'> p2 = People("二狗", "黑色", 145, 148)
print(p2) # <__main__.People object at 0x00000183AED502B0>
print(id(p2)) #
print(type(p2)) # <class '__main__.People'> # ==== 执行结果 === Ps:可以看到并没有使用()调用类 """
执行了...
"""
__dict__方法
类:可以查看到当前类下所有的类属性以及类方法
实例对象:可以查看到当前实例对象下所有的实例属性以及实例绑定方法
class People(object): # <-- 类名:驼峰体, (继承类),可以写也可以不写,推荐写上。
"""这是人类""" # <-- 说明 number_of_eyes = 2 # 眼睛数量
number_of_mouths = 1 # 嘴巴数量
number_of_ears = 2 # 耳朵数量
number_of_noses = 1 # 鼻子数量 def __init__(self, name, color, height, weight): # 方法/功能
self.name = name # self ---> 实例化对象
self.color = color
self.height = height
self.weight = weight def speak(self, content): # 方法/功能
print("{0}说:{1}".format(self.name, content)) # ==== 查看类字典 ==== print(People.__dict__) # ==== 查看实例字典 ==== p1 = People("云崖", "黄色", 192, 158)
print(p1.__dict__) # {'name': '云崖', 'color': '黄色', 'height': 192, 'weight': 158} # ==== 执行结果 === Ps: 可以看到类字典中具有类所有的属性及方法,而实例字典中只有实例自己的实例属性。(当然你也可以为其添加实例方法) """
{'__module__': '__main__', '__doc__': '这是人类', 'number_of_eyes': 2, 'number_of_mouths': 1,
'number_of_ears': 2, 'number_of_noses': 1, '__init__': <function People.__init__ at 0x000001B8650DFF70>,
'speak': <function People.speak at 0x000001B86D4B9700>, '__dict__': <attribute '__dict__' of 'People' objects>,
'__weakref__': <attribute '__weakref__' of 'People' objects>} {'name': '云崖', 'color': '黄色', 'height': 192, 'weight': 158}
"""
类属性与实例属性的增删改查
无论是对实例化属性/方法,或者是对类属性/方法进行增删改查,实际上都是非常单纯的对
__dict__进行操作。类属性的增删改查:会影响所有实例化对象。
实例属性的增删改查:只会影响当前实例化对象,不会影响其他实例化对象以及类。
注意:一般不会对实例新增某个单独的方法,没有这种玩法...而且除开元类编程,类方法的定义也不会放在外部。所以这里只是针对类属性或实例属性的增删改查

class People(object): # <-- 类名:驼峰体, (继承类),可以写也可以不写,推荐写上。
"""这是人类""" # <-- 说明 number_of_eyes = 2 # 眼睛数量
number_of_mouths = 1 # 嘴巴数量
number_of_ears = 2 # 耳朵数量
number_of_noses = 1 # 鼻子数量 def __init__(self, name, color, height, weight): # 方法/功能
self.name = name # self ---> 实例化对象
self.color = color
self.height = height
self.weight = weight def speak(self, content): # 方法/功能
print("{0}说:{1}".format(self.name, content)) # ==== 实例化对象 ====
p1 = People("云崖", "黄色", 192, 158)
p2 = People("二黑", "黑色", 155, 148) # ==== 类属性属性的增 ==== People.number_of_leg = 2 # 腿的数量 相当于 People.__dict__["number_of_leg"] = 2 # ==== 类属性、方法的删 ==== del People.number_of_eyes # 解除属性名number_of_eyes与其堆内存存储值的绑定关系 相当于 del People.__dict__["number_of_eyes"]
del People.speak # 解除方法名speak与类方法内存空间的绑定关系 相当于 del People.__dict__["speak"] # === 类属性的改 ==== People.number_of_mouths = "一" # 相当于 People.__dict__["number_of_mouths"] = "一" # === 类属性的查 ==== print(People.number_of_leg) #
print(People.number_of_mouths) # 一 # === 类的属性增删改查对实例的影响 === 总结:类属性任何增删改查都会影响其实例化对象
print(p1.number_of_mouths) # 一
print(p2.number_of_mouths) # 一
类属性增删改查对其实例化对象的影响

class People(object): # <-- 类名:驼峰体, (继承类),可以写也可以不写,推荐写上。
"""这是人类""" # <-- 说明 number_of_eyes = 2 # 眼睛数量
number_of_mouths = 1 # 嘴巴数量
number_of_ears = 2 # 耳朵数量
number_of_noses = 1 # 鼻子数量 def __init__(self, name, color, height, weight): # 方法/功能
self.name = name # self ---> 实例化对象
self.color = color
self.height = height
self.weight = weight def speak(self, content): # 方法/功能
print("{0}说:{1}".format(self.name, content)) # ==== 实例化对象 ==== p1 = People("云崖", "黄色", 192, 158)
p2 = People("二黑", "黑色", 155, 148) # ==== 实例化对象属性的增 ==== p1.number_of_leg = 2 # 腿的数量 相当于 p1.__dict__["number_of_leg"] = 2 p1.p1_del_val = "将要删除的值" # 相当于 p1.__dict__[p1_del_val] = "将要删除的值" # ==== 实例化对象属性的删 ==== del p1.p1_del_val # === 实例化对象属性的改 ==== p1.number_of_mouths = "一" # 相当于 p1.__dict__["number_of_mouths"] = "一" # === 实例化对象属性的查 ==== print(p1.number_of_leg) #
print(p1.number_of_mouths) # 一 # === 实例化对象的属性增删改查对其他实例化对象及类的影响 === 总结:实例化对象对于属性增删改查只影响自己,并不影响其他实例化对象,更不会影响类本身。 # -- 类,与其他实例化对象没有下面两个属性 --
# print(p2.number_of_leg)
# print(People.number_of_leg) print(p1.number_of_mouths) # 一
print(People.number_of_mouths) #
print(p2.number_of_mouths) # # Ps: 也可以用 实例对象名称[属性名称]来进行操作。
实例化对象属性增删改查对其他实例化对象及其类的影响
__init__方法与self参数
__init__方法:是实例化对象时所自动调用的方法。必须返回一个None,否则抛出异常,通常我们用它来构造实例化对象特有的一些属性。
self参数:在__init__方法中应当是一个即将被实例化的空对象,下面的self.xxx = yyy其实都是在为这个空对象中的变量名进行赋值操作。而在其他方法中,self参数指的是已经实例化好的对象本身。
前面说过,类是存放实例化对象中一些共有的方法与属性的,这些共用的方法和属性称之为类方法、类属性。那么我们肯定是允许每一个实例化对象拥有自己一些差异化的内容,这些差异化内容的传递其中最简便的方法就是使用Python为我们提供的 __init__ 方法。
def __init__(self, name, color, height, weight): # 方法/功能
self.name = name # self ---> 实例化对象
self.color = color
self.height = height
self.weight = weight
class TestInit(object):
def __init__(self):
print(self) # 此时产生一个空对象
print(self.__dict__) # {}
self.x = "任意值"
print(self.__dict__) def testobj(self):
print(self.__dict__) t1 = TestInit() # 这一步实际上是将生产的对象self赋值给了t1
print(t1)
print(t1.__dict__) # === self的常规玩法 === t1.testobj() # 我们的实例对象在调用该方法时,会将自身传入进去 # === self的其他玩法 === 当使用类调用某类方法时,我们只需要为其传入一个对象对应上self参数即可。 TestInit.testobj(t1) # 和上面均属于相同的操作。 t2 = TestInit()
t2.__dict__ = {"t2专属__dict__": None} TestInit.testobj(t2) # ==== 执行结果 ==== """
<__main__.TestInit object at 0x000001A1FF763E80>
{}
{'x': '任意值'}
<__main__.TestInit object at 0x000001A1FF763E80>
{'x': '任意值'}
{'x': '任意值'}
{'x': '任意值'}
<__main__.TestInit object at 0x000001A1FF7D02B0>
{}
{'x': '任意值'}
{'t2专属__dict__': None}
"""
实例化的绑定方法
当实例化一个类对象的过程中,类方法会变为该实例化对象的绑定方法。绑定方法的作用在于不用传入
self参数,而是自动传入self参数为当前的实例化对象。Ps:当使用类调用需要传入
self的类方法时,必须手动将对象传入self中。注意区分,实例绑定方法与类中的方法。
#
class People(object): # <-- 类名:驼峰体, (继承类),可以写也可以不写,推荐写上。
"""这是人类""" # <-- 说明 number_of_eyes = 2 # 眼睛数量
number_of_mouths = 1 # 嘴巴数量
number_of_ears = 2 # 耳朵数量
number_of_noses = 1 # 鼻子数量 def __init__(self, name, color, height, weight): # 方法/功能
self.name = name # self ---> 实例化对象
self.color = color
self.height = height
self.weight = weight def speak(self, content): # 方法/功能
print("{0}说:{1}".format(self.name, content)) # ==== 实例化对象 ==== p1 = People("云崖", "黄色", 192, 158) # ==== 查看类方法 ==== print(People.speak) # <function People.speak at 0x0000024EE94A8700> # ==== 查看绑定方法 ==== print(p1.speak) # <bound method People.speak of <__main__.People object at 0x000001C6D32B3E80>> bound method 绑定方法

类与实例对象的命名空间作用域及属性查找顺序

Python初识类与对象的更多相关文章
- 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
- python的类和对象2(self参数)
python的类和对象2(self参数) 1.python里面对象的方法都会有self参数,它就相当于C++里面的this指针:绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在 ...
- 《Java从入门到失业》第四章:类和对象(4.1):初识类和对象
4类和对象 在第一章曾经简单介绍过,在面向对象的世界里,一切事物皆对象,当解决一个问题的时候,我们先会考虑这个问题会涉及到哪些事物,然后把事物抽象成类,当时还画了一张图如下: 从本章开始,我们一点一点 ...
- Python基础之初识类和对象
我们在前面学习了解了面向过程编程,接下来我们一起来学习一下面向对象编程.其实不管是面向过程,还是面向对 象,说白了就是一种编程方式而已.既然是面向对象编程,顾名思义,此编程方式的落地需要使用 “类” ...
- python基础-第七篇-7.1初识类和对象
创建类和对象 刚开始我们接触得多的编程方式为面向过程编程,这种方式就是根据业务逻辑从上往下垒代码,后来又出现了函数式编程,就是为了提高代码的重用性,减轻程序猿的工作量--而今天我们即将学的 面向对象编 ...
- python的类与对象
类与对象 1.什么是类 类和函数一样是程序编程的一种方式,在处理某些问题的时候类比函数更加适合让编程变得简化,在python里面函数式编程和类编程都是为了简化代码的一种编程方式,具体应用那个则由具体问 ...
- python的类和对象——番外篇(类的静态字段)
什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首 ...
- python的类和对象——进阶篇
写在前面的话 终于,又到了周五.当小伙伴们都不再加班欢欢喜喜过周末的时候,我刚刚写完这一周的游戏作业,从面对晚归的紧皱眉头到现在的从容淡定,好像只有那么几周的时间.突然发现:改变——原来这么简单.很多 ...
- Python 定制类与其对象的创建和应用
1.创建新类Athlete,创建两个唯一的对象实例sarah james,他们会继承Athlete类的特性 >>> class Athlete: def __init__(self, ...
随机推荐
- Library source does not match the bytecode for class 最佳解决方案
首先分析问题 打完的jar包,编译的后class跟java文件不一致,原因是重新打包后还是引用之前的java文件,不能重新加载新生成的jar. 解决方案 方案一 IDEA 工具,点击File > ...
- 【Java8新特性】关于Java8中的日期时间API,你需要掌握这些!!
写在前面 Java8之前的日期和时间API,存在一些问题,比如:线程安全的问题,跨年的问题等等.这些问题都在Hava8中的日期和时间API中得到了解决,而且Java8中的日期和时间API更加强大.立志 ...
- GNS3内网配置虚拟机测试
一.背景:考虑在GNS3内网配置一台虚拟机系统,用于大流量测试. 二.环境: 1.win10系统已安装:GNS3和配套GNS3VM虚拟机(版本号:2.2.7):vmware虚拟机winxp(名称为:W ...
- Chisel3 - Tutorial - Stack
https://mp.weixin.qq.com/s/-AVJD1IfvNIJhmZM40DemA 实现后入先出(last in, first out)的栈. 参考链接: https://gi ...
- 一文说通Dotnet Core的中间件
前几天,公众号后台有朋友在问Core的中间件,所以专门抽时间整理了这样一篇文章. 一.前言 中间件(Middleware)最初是一个机械上的概念,说的是两个不同的运动结构中间的连接件.后来这个概念 ...
- 使用Mac的Remote Desktop Manager连接ubuntu16.04 & Win10的远程桌面
疫情严重,公司实行远程办公.自己只有mac电脑,苦于3个系统间跨平台建立远程桌面. 今天,终于尝试成功!特来记录,以防别人踩坑! Mac远程软件安装 Remote Desktop Manager软件非 ...
- Java实现 LeetCode 477 汉明距离总和
477. 汉明距离总和 两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量. 计算一个数组中,任意两个数之间汉明距离的总和. 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进 ...
- Java实现二分图的最大权匹配
1 问题描述 何为二分图的最大权匹配问题? 最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大. 2 解决方案 解决这个问题可以用KM算法.理解KM算法需要首先理解& ...
- java实现显示为树形
** 显示为树形** 树形结构应用十分广泛. 下面这段代码根据用户添加的数据,在内存中构建一个逻辑上等价的树形结构. 通过ShowTree() 可以把它显示为控制中的样子. 其中: a.add('a' ...
- 判断IP是否是IPV4
bool isVaildIp(const char *ip) { int dots = 0; /*字符.的个数*/ int setions = 0; /*ip每一部分总和(0-255)*/ if (N ...