扫码领取大额优惠劵
时间:2022-10-23 14:07:45 来源:洛阳尚贤科技
做软件,是要给人用的,人在用之前是没有数据的,但人用了就有数据,这就需要用到类,把共性的元素抽象出来形成母版。然后基于这个母版,在人用的时候产生数据。
面向对象的*步是做类,类是连接现实与虚拟的一座桥梁。 光有这个桥没用,因为它不具体,所以得具体化之后,形成一个对象,让对象成为现实控制现实。写类的时候,满脑子都是如可抽象出共性,类就出来了; 当从类到对象的时候,又要满脑子想具体化。 为什么要先抽象再具体? 因为只有先抽象再具体,才能建立起桥梁来表现具体化的东西, 这是为了在虚拟的世界中掌握现实!
类:一个抽象的概念,即生活中的 “类别”
对象:类的具体实例,即归属某个类别的 “个体”
类是创建对象的 “模板”,它有两成员:
——数据成员:名词类型的状态。 即变量。
——方法成员:动词类型的行为。 即函数。
1、程序执行到类后,类中的代码只是存储到了内存中,并不会执行,所以它叫代码区。
2.1、创建对象时,在内存中所开的空间大小,取决于init方法中的实例变量的数量,比如有三个就是三块地。这三块地,就是类的属性。比如品牌价格之类的
2.2、创建对象时,除了在内存中开辟空间之外,它还在调用 init 这个函数。 调函数就会开栈帧,开一个 init的栈帧。 在这个栈帧里开多少空间,就看init中的对象实例变量数量。示例中有3个。其实是4个,还有个self.
2.3、创建对象填参数时,为什么不把self加上? init 中的 self是位置形参,那么调用函数填参数时得是必填的。其实不是没加,因为在创建对象时python已经自动给 init 中的self 加上了一个对象地址。 只不过这是自动的你看不见。 而 init 中的self 也只有一个功能,就只是存储对象地址。 即:把你创建的对象的地址,存到init中的self里。让 init 中的 self 知道这是哪一个对象在给他存信息。
2.4、因此,之所以自动创建对象地址传给init 函数中的self, 是因为self只是用于存储对象地址的。那这个init 中的self 名字还可以自定义,但这个位置本身是python“征收” 了必须有的。
2.6、self是怎么接收到对象地址的呢? 看看init 下面的实例变量的格式就知道。 它通过一个点, self.变量名, 就是这样找到变量地址,再通过变量地址找到对应的其它几个参数。 self. 点方法也可以,点实例变量也可以。
3、所以,整个栈帧存在的价值,就是给变量赋值,然后栈帧就销毁了。
4、栈帧虽然销毁了,它但的作用已经起到了,此时对象就知道自己的信息了
5、对象创建后,开始调用函数。在调用函数时,为什么语法是 aa.bb() 呢,因为这是语法要求, 它其实本质上就是 bb(aa)。 也就是把对象做为实参,传入到bb这个函数的形参里。 所以, 就是说对象在调用函数时,会把自己做为参数传给函数中的self.
5.1、即然又调函数,那就会给这个函数开一个栈帧。这个栈帧只有一个空间,也就是self这个参数,这个self指向的与对象指向的是一样的,因为对象和self存的是同一个变量地址。
当再创建对象,并调用函数时。一切又重来一遍。
总结:一个函数怎么知道又找苹果,又找华为? 因为对于不同的对象来说,一个函数的栈帧接收到的self不同。
是它能表达不同对象、不同数据。 什么意思呢? 比如在面向过程中,想表达一个人名,name = ‘ 小花 ’ 即使它是在全局变量中,这个name也只能表示小花一个人,无法表达其他人。 想表达多个,怎么办,即使做个列表,那也是死的。
但是类里面的实例变量,可是能表示无数人的,因为类可以创建无数对象。所以,实例变量能表达不同对象、不同数据。 所以,面向对象能成为主流的编程思想。
class Abc( ):
def __init__(self):
self.a = 10 # 这里写成10,上面不做参数,前面的照样也是实例变量。因为实例变量的语法是 对象—点儿—等号后面跟数据
最后举个例子,先来看面向过程 按格式打印列表中的字典;
list_commodity = [ {'cid': 1001, 'name': '小红', 'price': 10000}, {'cid': 1002, 'name': '小蓝', 'price': 10000}, {'cid': 1003, 'name': '小花', 'price': 52100}, {'cid': 1004, 'name': '小紫', 'price': 20}, {'cid': 1005, 'name': '小白', 'price': 30}, ] def print_single_commodity(item): print(f"编号{item['cid']}:, 商品名称{item['name']}, 价格{item[‘price']}") def print_commodity(): for commodity in list_commodity: print_single_commodity(commodity) print_commodity()
再来看面向对象,实现同样功能 (区别在于,面向对象时,“母版”可以被无数对象使用,比如“编号、名称、价格” 这些共性的元素。
class ListCommodity(object): def __init__(self, cid, name, price): self.cid = cid self.name = name self.price = price list_commodity = [ ListCommodity(1001, '小红', 10000), ListCommodity(1002, '小蓝', 10000), ListCommodity(1003, '小花', 52100), ListCommodity(1004, '小紫', 20), ListCommodity(1005, '小白', 30), ] def print_single_commodity(item): print(f"编号{item.cid}:, 商品名称{item.name}, 价格{item.price}”) def print_commodity(): for commodity in list_commodity: print_single_commodity(commodity) print_commodity()
手机:18537972228
电话:0379-64321586
Email:shangxian@sxglpx.com
地址:洛阳市涧西区九都西路181号中弘中央广场D座2705室