Python 对象与面向对象的认识

Python是一门面向对象的编程语言,即一切内容皆对象。

得知对象中有三个属性,分别是ID【内存地址】、类型【int、float、str、list、dict等】、值。

那代码中哪些内容是对象呢,那些是对象的引用呢,又有哪些是对象的属性呢?下面依照上面的信息举一些小栗子

  1. 栗子1:
    a="Oliver"

    这是一个简单的赋值语句,字符串Oliver为一个对象,a 是一个引用,利用赋值语句,引用 a 指向了对象Oliver;就好比我们去吃九宫格,每个格子代表一个内存地址,串的多少代表值,是什么串羊肉的牛肉的代表数据类型,而我们的手去拿串的过程代表引用,当我们的手拿到串的时候,手(a)就被串赋值了串(Oliver).【比如不是很恰当】。可能有人说a是被赋值的对象,不要着急,我们继续看下面。

  2. 栗子2 :
    a="Oliver"
    a="Bob"

     之前我们有说到对象有一个属性叫做ID,如果a是被赋值的对象,那以上信息两个a的地址应该不变才对,那我们下面查看一下两个的ID信息.在这可以看到,查看到的两个ID是不一样的。可能又有人说,这是两个重名的对象。你要是说有呢,请继续看下面。

  3. 栗子3:
    a="Oliver"
    b="Oliver"

    以上可以看到“Oliver”被两次引用,现在查看一下两个的ID。经查看发现a,b的id是一样的,那就说明是调用的同一个源,反过来说明a,b不是对象,Oliver是对象。等等,第二次查看到的id(a)的值为什么跟栗子2中的不一样,哦,原来python有一个内存处理机制,当我们在栗子2中引用“”Bob“的时候,原先的a="Oliver"给当成垃圾回收了,自然原先的地址就没有了,当再次重新引用赋值的时候,就重新划拨新地址了。现在我们可以确认了“=”号右边的是对象,那左边的内容就不是对象吗,请继续看下面。

  4. 栗子4:

    a = "Oliver"
    b = a
    

    可以看到上面,a引用了"Oliver",b又引用了a那我们继续看一下他们的ID值在这里面可以看到,在b重新引用a的时候,id跟a的id是一样的。那就是对于b=a来说,a是对象,只不过a是引用的“Oliver”的属性。那这只是赋值语句,那内置函数与自建函数生成的对象呢,请继续往下看。

  5. 栗子5:

    list01 = list(filter(lambda x :x if x%2 ==0 else None,range(1,10)))
    list02 = list(filter(lambda x :x if x%2 ==0 else None,range(1,10)))
    list03 = list02
    def Function():
        list = []
        for i in range(1,10):
            if i % 2 ==0:
                list.append(i)
            else:
                None
        return list
        
    

    在上面我们定义了两个列表与一个自建函数,那我们调用查看值与ID,在这里面我们可以看到,虽然右边的式一样,但是对应的ID是不一样的,这样可以理解为在内存中划拨了凉快区域,只不过在这两块区域他们的类型与值是相通的,但是值是不同的。下面我们在看一下自建函数。自建的函数也是一样的,虽然值跟类型相同,但是实际上是不同对象。那如果我们修改里面的值得信息,是否会发生变化呢?请继续看下面。

  6. 栗子6:

    list01.append(10)

    我们在原先的list01中添加元素10.查看到ID其实是不变的,那是不是我们就可以理解为对象值得修改是不是ID都不变呢?我们继续往下看。

    a = "Oliver"
    b = a
    a += "WHO"
    

    在上面我们修改了a的值,查看到当我们修改了a的值得时候,对应的ID是发生变换的,而原先的Oliver的信息是没有发生变化的,其实是新建了一个对象划拨了一个地址,将新的地址赋值给了a。【这就是可变对象与不可变对象的区别】

对象的信息可以清楚了,下面说一下面向对象的内容。面向对象是具有相同属性和方法的对象的集合。而里面一个个定义的具体的实力就是这个面向对象的对象。请继续往瞎看。

class People(object):

    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    
    def printed(self):
        print(self.name,self.age,self.sex)

My = People("Oliver",25,"男")
You = People("Bob",23,"男")
Copy = People("Oliver",25,"男")
My.printed()
You.printed()
Copy.printed()

运行之后我们可以看到,在面向对象中,如果值相同并不是指的是同一个对象,面向对象是对象的集合,而My,You,Copy是被People()具体实例化的内容。

猜你喜欢

转载自blog.csdn.net/m0_37801537/article/details/81098874
今日推荐