欢迎访问尚贤官网,我们提供网站建设与推广服务!
全国热线:18537972228

扫码领取大额优惠劵

您当前位置: 技术开发 - 面向对象的价值(Python)

面向对象的价值(Python)

时间: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()


我们提供整套的互联网整合营销托管服务,深度研究SEO技术在网络营销中的创新和运用,为内贸与外贸企业
量身定制高转化率的网站设计开发与SEO营销解决方案。
了解更多
领取优惠 电话咨询