首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

第十三讲——类、对象、对象的属性,方法

第十三讲——类、对象、对象的属性,方法

回顾一下上一讲的部分内容,上一讲讲了类和对象的概念、方法和属性的概念,理解了父类和子类,类的继承、重写,这些内容将要花费两讲的时间去讲解,本讲的主要内容就是类、对象、属性和方法。

开始喽

先写一个最普通的类,接收几个参数,然后声明一个对象,然后打印属性。

上一讲中已经知道这样写的原因,使用 . 符号是调用某一个对象内部的方法或者属性,那么,如果我们直接打印对象会出现什么情况呢?

翻译过来就是,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的我们的生活

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190113G0X0PU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券