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

解惑答疑

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

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参数是很有必要的

洗礼灵魂,修炼python(32)--面向对象编程(2)—进一步认识类的更多相关文章

  1. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  2. Python之面向对象编程学习

    不知不觉,学到了python的面向对象编程思想.今天我们来讨论下面向对象编程的思想. 顾名思义,面向对象,就是面向于对象,这里所说的对象不是你现实生活中你的女朋友,你的老婆,你的爱人,在编程的世界里面 ...

  3. Python基础 — 面向对象编程基础

    目录 1. 面向对象编程基础 2. 定义类和创建对象 3. init() 方法 4. 魔法方法 5. 访问可见性问题 5. 练习 1. 面向对象编程基础 把一组数据结构和处理它们的方法组成对象(obj ...

  4. python笔记 面向对象编程从入门到高级

    目录: 一.概念 二.方法    2.1组合 2.2继承 2.3多态 2.4封装 2.5归一化设计 三.面向对象高级   3.1   反射(自省) 3.2   内置方法__getatter__, __ ...

  5. Python:面向对象编程3 定制类(有更新)

    Python:面向对象编程3  定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...

  6. python基础-面向对象编程

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...

  7. python之面向对象编程

    1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...

  8. Python(面向对象编程—1)

    class tst: l=[] x=1 a=tst() b=tst() a.l.append('a') b.l.append('b') a.x='a' b.x='b' print(a.l,a.x) # ...

  9. python的面向对象编程

    面向对象编程是一种程序的范式,它把程序看成是对不同对象的相互调用,对现实世界建立的一种模型. 面向对象编程的基本思想,类和实例.类用于定义抽象对象,实例根据类的定义被创建出来. 在python当中我们 ...

  10. 一文看懂Python的面向对象编程

    之前在网络上看了很多关于面向对象的编程详解,还是不够过瘾,所以决定自己动手写一篇. 面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计. 类(Class) ...

随机推荐

  1. python买卖股票的最佳时机--贪心/蛮力算法简介

    开始刷leetcode算法题 今天做的是“买卖股票的最佳时机” 题目要求 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更 ...

  2. C# 窗体间传值

    Form1: 父窗体, Form2: 子窗体. 1.父窗体接收子窗体的返回值: public partial class Form1: Form { private void btnOpen_Clic ...

  3. myslide 插件开发知识点总结和 css3 动画性能问题的研究

    myslide 插件开发知识点总结和 css3 动画性能问题的研究 这篇文章主要是总结最近开发过程中遇到的问题.有几个问题又是不容易发现原因的问题,但是最后的结果又是很简单的. 1.手机端的 slid ...

  4. Volley Post网络请求

    /*post请求*/public void dostringVolleypost(){ /*第一步,创建请求队列*/ queue = Volley.newRequestQueue(this); /*第 ...

  5. 最好用的lua编辑器--------emmylua使用汇总

    最好的lua编辑器Emmylua,欢迎打脸 官方文档   https://emmylua.github.io/zh_CN/ github      https://github.com/EmmyLua ...

  6. set 和hash_set和海量数据的处理问题

    什么样的结构决定其什么样的性质,因为set/map/multiset/multimap都是基于RB-tree之上,所以有自动排序功能, 而hash_set/hash_map/hash_multiset ...

  7. 由sql注入联想到PreparedStatement

    PreparedStatement极大地提高了安全性. 即使到目前为止,仍有一些人连基本的恶意SQL语法都不知道. String  sql  =  "select  *  from  tb_ ...

  8. 使用centos 7安装conpot

    使用CentOS的版本7.3和Conpot 0.5.1(也可能适用于其他CentOS的版本) 1.通过ssh登录系统,并需要具有足够的系统特权(e.g root) 2.系统升级 yum -y upda ...

  9. NABCD校园生活

    N(Need,需求) 在校师生得到的信息分散,极大的影响了师生的学习效率,所以就会有快速得到全面信息的需求,而我们的APP正是在解决这个问题. A(Approach,做法) 我们会在主页进行信息分类, ...

  10. [PHP] 数据结构-输出链表倒数第k个结点PHP实现

    输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了 <?php clas ...