zoukankan      html  css  js  c++  java
  • 洗礼灵魂,修炼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参数是很有必要的

  • 相关阅读:
    HDU 1874 畅通工程续(dijkstra)
    HDU 2112 HDU Today (map函数,dijkstra最短路径)
    HDU 2680 Choose the best route(dijkstra)
    HDU 2066 一个人的旅行(最短路径,dijkstra)
    关于测评机,编译器,我有些话想说
    测评机的优化问题 时间控制
    CF Round410 D. Mike and distribution
    数字三角形2 (取模)
    CF Round410 C. Mike and gcd problem
    CF Round 423 D. High Load 星图(最优最简构建)
  • 原文地址:https://www.cnblogs.com/Eeyhan/p/7672635.html
Copyright © 2011-2022 走看看