类是模具,对象是实体。
举个例子:人是类,某个具体的人是对象。 王五就是一个对象,王五是一个人,但人却不是王五。
类的抽象层次更高,人这个类,拥有人的所有通用属性和行为。
记住,面向对象编程,就是在设计某些类的属性、行为。
Python中所有的东西都是对象。
在其他语言中,基本数据类型不是对象,而是值。但在Python里,基本数据类型也是对象。
面向过程思想,个人理解:程序=数据结构+算法的体现。即,写这段代码的程序员是一个具体的执行者,所有的事情都要自己干。
比如,在编写冰箱程序时,要想冰箱门具体应该怎么打开,旋转多大的角度?旋转的角度过大怎么处理?怎么制冷?用什么公式计算?
面向对象编程时,写这段代码的程序员不再是执行者,而是一个调度者。
比如,编写冰箱程序时,先想想有什么对象?怎么装东西:让冰箱把门打开,装进去,让冰箱把门关上。 具体怎么关的?写这段代码的程序员不知道,冰箱自己最清楚。
程序员从一个执行者变为了一个调度者,这更符合人类的思维方式,因此适用于构建大型的软件系统。
你在现实中生病了,会去学习医术吗?不会的。你会去找大夫,具体怎么治病,那是大夫的事。
你在现实中电视机坏了,你会去学习电视机的原理吗?不会的。你会去找维修工。具体怎么修,那是维修工的事。
但是,代码真的少写了吗?要具体情况具体分析。如果你写的代码,类都需要重新实现,那写的代码并没有少。如果这个世界上没有人懂医术,总要有人先学习医术,你才能去找他看病。
而且,面向对象编程要对队友极度的信任。因为你只是在调用别人写的类,你是调度者,这个类不是你写的,你无法保证这段代码没有bug。
定义类代码:
class Demo:
pass
Python中的类名应该是大驼峰(即每个单词的首字母都大写)的。这并不强制,但是一种规范。
也许你听过新式类和经典类的概念。但Python3中都是新式类。
实例化(创建)对象代码:
class Demo:
pass
d = Demo()
首先,我们来打印一下类:
class Money:
pass
print(Money)
输出:
<class '__main__.Money'>
我们看到一个奇怪的字符串,看上去是一个类,标识了这个类的名称。来验证下:
class Money:
pass
print(Money)
print(Money.__name__)
输出:
<class '__main__.Money'>
Money
看上去没错的。
Python开辟了一片内存空间用于存储类。这片存储空间会返回一个唯一标识(可以认为是一个地址)给以类名命名的这个变量。
内存图大概是这样的:

即,是先开辟了一片内存空间存储类,然后把这个类的唯一标识跟Money这个变量进行了绑定,所以我们可以通过Money这个变量来操作类。
class Money:
pass
d = Money()
print(Money)
print(d.__class__)
输出:
<class '__main__.Money'>
<class '__main__.Money'>
首先,对类进行实例化时,会开辟一片内存空间用来存储对象。这个对象中有一个__class__属性,指向创建它的类。然后,这片内存空间也会返回一个唯一标识,在这个例子中,存储这个唯一标识的变量是one. 我们通过one即可操作对象。
此时,内存图大概长这样:
