第十三讲——类、对象、对象的属性,方法
回顾一下上一讲的部分内容,上一讲讲了类和对象的概念、方法和属性的概念,理解了父类和子类,类的继承、重写,这些内容将要花费两讲的时间去讲解,本讲的主要内容就是类、对象、属性和方法。
开始喽
先写一个最普通的类,接收几个参数,然后声明一个对象,然后打印属性。
上一讲中已经知道这样写的原因,使用 . 符号是调用某一个对象内部的方法或者属性,那么,如果我们直接打印对象会出现什么情况呢?
翻译过来就是,main 里面的 Foo 的 object(对象) at (在):一个十六进制的地址
main 就是我们的这个文件,默认情况下,我们用来启动程序的那个文件成为main文件(比如 python test1.py 中,test1为main文件)。
所以 print 打印 obj1 这个对象,打印的就是 obj1 这个对象的物理属性,这就是默认效果。
那么,这句话哪里来的呢?
在 Python 中,如果打印一个对象,其实质可以认为是调用这个对象内部的一个方法叫做 __str__() ,这个方法打印这么一句话,然后返回一个None。
所以如果我们想要打印别的东西,只需要这样写:
为什么是使用 return 返回一个字符串而不是直接print打印呢?
print 打印一个对象是调用这个方法,如果直接在 __str__() 内部打印,不论我们是否 return ,默认都会返回一个空,然后就会报异常,说__str__() 返回了一个空类型。有感兴趣的同学可以尝试一下, 将 __str__() 中的代码改成下面的(当然前提是前面所有的代码调通):
def __str__(self):
print('My name is %s, I\'m %d years old, %s'%(self.name, self.age, self.gender))
异常类似于下面这样:
TypeError: __str__ returned non-string (type NoneType)
没错,这里才是正文,哈哈哈!!!!!!!
像上面的例子中,我们的命名规则和平常的明明规则一样,这里就不再说了,前面已经讲过,请移步前面的教程。
在类中,命名也是有规则的,以是否以一个或者多个下划线为标准,首先,我们先来学习另一个东西:dir()
可以列出某个对象所有可以调用的属性:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'gender', 'name']
上面是所有的内容,我们可以找到,他的属性在里面,有age、gender、name三个属性,以及 __str__() 的方法,其他的各位随着学习会慢慢了解,不要着急。
并且大家可以看到,几乎所有的非我们定义的方法或者属性都是双下划线开头的,为什么呢?
在类中,命名方法有以下五个就是(命名中间的下划线有多少个都无所谓):
一:没有以下划线开始或者结尾
二:单下划线开始但不以下划线结尾
三:单下划线结尾但不以下划线开始
四:双下划线开始但不以下划线结尾
五:双下划线开始以及结尾
下面给大家分开讲解(命名方法在属性和方法上都适用):
01
没有以下划线开始或者结尾
就是我们最普通的命名方法,比如上面例子中的 name ,age,gender,都是这种,当然也可以夹杂其他的符号以区别命名,这一部分就跳过吧。嘿嘿。
02
单下划线开始但不以下划线结尾
可以认为是私有属性,但又和他有点区别,比如一个属性或者方法命名为 _foobar ,不论是属性还是方法,在继承是都可以被子类调用,但是把这个文件当作模块从别的文件导入时,就看不到了,可以认为是本文件下的私有属性(即只要是在本文件中的操作,都可以调用到这个属性)。
下面贴一个代码共大家理解:
03
单下划线结尾但不以下划线开始
这个并没有什么私有属性一说,但是是非常有用的,比如,def 是一个关键字,用来定义函数的,比如现在,我们需要有一个变量或者方法,也命名为def ,肯定会报错,但是,如果我们在后面加一个 _ ,就可以避免报错,进而使用类似于 def 的 def_ 这个名字,同样,贴一个代码供大家理解:
04
双下划线开始但不以下划线结尾
比如我们的名字是 __attr ,注意,这里是两个下划线,那么,这个属性或者方法有一下三个特点:
一、不能被继承
二、不能在类外边被调用
三、不能被导入
即:私有属性,只有自己能看见,其他所有人都看不见,代码如下:
异常提示就是,没有这个属性,那么调用方法呢?
同样的,没有这个属性,那么,这种私有属性或者方法有什么用呢?
私有属性或者方法一般用来做权限管理或者封装接口,比如:
我们要做一系列登陆的操作,而这些操作不能被任何人调用,就可以使用这种方法,下面写出一个伪代码供大家理解学习:
这样的话,我们的请求操作和密码或者其他很可能有的不想让别人知道的东西,使用私有方法属性去声明,就可以完成最基本的保密工作。
05
双下划线开始以及结尾
在这里不建议大家使用这种方式命名,一般来讲,这样命名的是内建(build-in)属性或者方法,比如 : __str__() , __doc__ 等等。
当然如果您真的想这样,当然是可以的,只是不建议。
06
嗯,是的,没有第六个,结束了
看了前面的内容,如果有什么不理解的,欢迎大家进群询问(点击主界面菜单的学习交流按钮就可以获取群号)或者后台留言,看到后一定会第一时间回复哦^_^!
PythonLive
觉得不错的话转发下吧^_~
致:有python的我们的生活
领取专属 10元无门槛券
私享最新 技术干货