• 洗礼灵魂,修炼python(32)--面向对象编程(2)—进一步认识类


    上一篇文章已经看到了如何定义类,但是我想你应该有很多疑惑的吧?最好的学习方法就是不断思考,不断问为什么,不断和已有知识做类比,从中获得理解。那么这一篇博文就是从解惑答疑中进一步认识类。

    解惑答疑

    我按照我的想法列出了几个主要的疑问:

    1.定义的类的方法可以单独拿出来调用吗?因为格式和定义函数是一样的

    先看看之前那个例子:

    class People():   
    
        #属性
        head=1  #一个头
        legs=2  #两条腿
        hands=2 #两只手    
    
        #方法
        def walk(self):
            print('走了一步')
        def seyhello(self):
            print('看见熟人打招呼')

     我试试单独拿出来调用和实例化对象调用作对比:

    注意到了吗?【name 'walk' is not defined】,应该明白了类里方法是不可以单独调用的

    2.方法的括号内为何要加self参数,这个参数有什么作用?

    还是用上面的例子,我不用self看看:

    这里报错是必然的,但注意看我标注那里,意思是,walk()和seyhello()方法不带参数,但是给了一个参数,这和这样的报错是一样:

    但其实我上面并没有带参数啊,实例化yang后,直接【yang.walk()】的来调用的,不可不加括号吧,加了括号才做调用的。所以这里和上面前后对比,我想你大概了解self方法有什么作用了吧?

    在python中,严格要求方法需要实例化才能调用(这里就解释了问题1的问题所在),而这种严格要求的限制就是python的绑定概念。所以python在运行代码【yang=People(),yang.walk()】时会自动把【yang】作为walk()的参数传入,才会报错提示不需要参数但传入了一个参数self的作用就是作为绑定,根据方法的类传进属性

    3.定义的类可以传参吗?

    可以的。例:

     

    其中的【21】就是我传入的参数

    4.类属性和实例属性有什么区别?

    就借用问题3里的例子:

    运行结果:

     看这个例子我想你大概都能懂了。

    不需要实例化,直接类就可以直接访问的就是类属性,当被实例化后,实例化对象也获得了其属性,而实例属性需要实例化后才可以访问

    5.错误的方法赋值:

    为什么会出错:因为a本来是方法,在方法调用之前如果给其重新赋值,只有属性才不加括号直接调用的,此时即把方法变成了属性,所以调用报错,即此时

    属性会覆盖方法

    所以,当我们把实例化对象的方法在调用前重新赋值,那么再次调用方法会出错。记住这一点,以后切不可这么干

    这里说个诀窍,防止属性和方法混淆:定义类的属性和方法的诀窍(很有用):

    • 属性名用名词
    • 方法名用动词

    6.类,类对象,实例对象之间到底什么关系?

    看图:

     

    (图片来自网络)

    如果你还没看懂,那么你可以这么理解,比如人,地球上的所有人都属于人类,这一个大的群体就是一个,这个【人类】也就是一个类对象,然后地球上的人都分布各地,来自各个国家,有各自不同的特征和说着不同的话,不同的工作(这也是类的多态),在这里面的每一个人就是一个实例对象

    补充

    在前面问题4里,我在定义类时,传入了一个object对吧?

    相信你肯定有疑问,这个object就是对象的意思,由于在python中一切皆对象,所以利用object就可以代表所有的参数,就和前面的基类异常Exception可以代表所有的异常一样的原理,并且注意了,这是python3的写法,先看看这样的写法:

    哎?有什么不同吗?还真有些不同。那么到底哪些不同呢?

    python3:(看print写法可以看出是python3)

    1)不带括号和object

    2)带括号和object

    python2:

    1)不带括号和object

    2)带括号和object

    乍一看,在python2和3中使用分别两种写法确实没发现不同,但是且看下面:

    python3下:

    在python3下,已经默认就帮你加载了object,即便你没有写上object

    python2下:

    看出来区别了吧?首先dir内置函数是查看对象属性和方法的,并没有对其进行更改的。python2中,很明显看出,不使用object参数,就不会继承object类的方法,默认只有doc , module 和 自己定义的变量,这个类的命名空间只有三个对象可以操作。而加入object的继承了object对象,拥有了很多属性和方法,这些都是类中的高级特性。刚接触python类的朋友可能觉得这些高级特性基本上没用处,但是对于后期要着手写框架或者写大型项目等的来说,这些特性就比较有用了

    虽然说不管是python2还是python3都有这两种写法,并且都是可行的。但是在python3中才等价于:,python2中还是有很大区别的。

    所以在实际开发中加上括号和object参数是很有必要的

  • 相关阅读:
    将多个字典添加到数组输出
    获取字典中的数组
    数组内的元素排序
    1字符串中的world替换为i bookan wisdom2.字符串的相加字符串输出,长度3比较字符串大小4截取字符串5字符串内所有a都替换成A6判断字符串是否以http开头7将字符串内admin和123截取出来8字符添加
    判断是否有前缀后缀
    截取字符串
    大小写
    数据存字典,block排序,删除
    block排序
    描述器 排序(根据属性)
  • 原文地址:https://www.cnblogs.com/Eeyhan/p/7672635.html
Copyright © 2020-2023  润新知