登陆注册
71628900000014

第14章 类的定义

一个类的主要价值在面向对象编程中是发挥抽象的作用。在 Python 中每一个数据类型都是某个类的实例。一个类提供了许多行为,每个行为也就是其中的方法,也就是定义成类的实例方法。

一个类也起到了作为自身实例的一种蓝图作用。这样对于一个类的每个实例来说,都能有效地确定状态信息,常会称为属性,有时也会叫做财产项。例如,实例变量,数据。

定义一个类如同定义函数似的,使用 class 语句,但是有几点特殊地方需要重新认识一下:

第一 self 识别符:

在 Python 中定义任何一个实例方法时,第一位置参数名使用了默认的 self 作为惯例。那么 self 这个参数扮演了一个重要的、关键的角色。那就是 self 会识别实例会使用哪一个方法。例如:

class C(object):

def __init__(self):

pass

def get(self):

pass

假设我们有一个 C 类,那么 a 和 b 分别是 C 的一个实例,当 a.get()的时候,或 b.get()的时候,C 类会知道是 a 调用了.get()方法还是 b 调用了.get()方法。这就是 self 参数的作用。

由于有了 self 这个关键作用,那么类的众多实例都只会维护着自己的状态信息。解释器会自动地把与实例牵扯在一起的方法绑定到 self 参数上,不会出现认错对象的现象。

第二构造器:

当建立一个类的实例时,例如 a = C()那么圆括号对儿的作用就是启动构造器开始建立类 C 的一个实例,并分配给变量 a 这个对象。构造器的作用就是调用类 C 做事情。

第三初始化:

当建立一个类的实例时,例如 b = C('name')那么圆括号对儿中的参数值会代入到类中的一个名叫 dunder init 实例方法中,这种使用类时提供参数值的用法是由类的实例初始化方法决定的。这与定义函数时有所不同,调用函数时直接把参数名描述在构造器中即可,而类在建立实例时要想使用参数的话,就要在类里写一个 dunder init 实例方法来决定调用类时的初始情况。例如:

class C(object):

def __init__(self, name):

self.name = name

这样的一个类定义完,使用时就只能用作 b = C('name')这种写法。参数 name 的值会分配给实例变量 self.name 这里要注意,右边的 name 参数名是位于本地范围中。

第四封装:

前面提到过命名前使用单个下划线时,会默认作为非公开名。那么实例不能直接使用这类数据。例如:

class C(object):

def __init__(self, name):

self._name = name

def get(self):

return self._name

作为一种通用规则,我们会把所有数据对象处理成非公开形式。这样能够让我们更好的保持所有实例的状态一致性。那么如果我们想要让实例访问这样的数据时,可以定义实例方法来发挥只读数据的行为,或者更新数据的行为。在这种数据结构中,封装内部的表现形式可以增加类的灵活性,可以对类的结构进行重新设计,提升效率。

第五检查错误:

对于例子中的数据类型我们没有做检查步骤,一般来说,名字的内容都应该是字符串类型,那么如果建立实例时使用了其它数据类型的话,虽然可以建立成功,但不是我们所期望的数据类型。如果在数据上进行操作的话,甚至会出现抛出例外错误的情况。

第六检测类:

前面提到过单元测试,最后我们会在 if __name__=='__main__':这个执行区域里去写一些对定义的类的测试代码。

类的定义基本上包含的注意事项就是以上六点,并不是直接写一个类就完成了定义类的工作。

同类推荐
  • 全民穿梭时代

    全民穿梭时代

    傲行从地下爬出来,看着周围一望无际的荒漠,口吐芬芳:“%¥*&#@!”爬出坑后,眼前出现一行数据:“前方1.7公里,可进入钢铁侠世界”抬头看见展翅100米的大鸟,飞行的堡垒,这是什么世界?“欢迎来到天网的世界”
  • 快穿之大佬在线

    快穿之大佬在线

    千月,快穿任务者,无CP,但能保证有喜欢女主的,大佬在线,血瞳拥有堪破一切的能力,力气大。性格不急不躁,不张扬不嚣张,只会淡淡的问你:“死?”
  • 快穿宿主每天都很冷静

    快穿宿主每天都很冷静

    【本文1v1,男主始终一人!】舒苏不知道第几个世界,总有个小妖精缠着她。痴情王爷,温柔缠绵道:“我以江山为卿映繁华,可不可以不要赶我走呀!”纨绔太子爷一身军装:“执子携手,与子偕老。”温柔黑化王子殿下:“我不管,我只要你!”玉面郎君目光深情与她十指交缠,神情认真缓缓道:“窈窕淑女,君子好逑。”高冷校草手挑起发尾,深深吸了一口:“美人入骨,相思知不知。”后来……舒苏:“印了章就是我的人了,我想怎么样就怎么样。”
  • 星空武道时代

    星空武道时代

    2130年,天空落下一场流星雨,空气中充满了特殊能量气体,当天各种野兽变异,进入城市,死伤无数,科学家研究,把这种特殊能量称为——神之气!“如果是神的赐予,那我就把神灭掉!”——弑神者.方羽
  • 快穿之追求boss路漫漫

    快穿之追求boss路漫漫

    【1v1,双洁,甜宠】千瓷来自于星际,却因陨石变成植物人,原本以为会消失在茫茫宇宙中,结果却被一个系统绑定了!开始了位面旅行,但是那个帅哥!别跑!我是你老婆!没错!我!是!你!老!婆!
热门推荐
  • 命里有只白狐狸

    命里有只白狐狸

    “小东西,看你还敢捣乱,看我揍不揍你!”“师傅,别揪我耳朵,疼!”
  • 万界战争皇帝

    万界战争皇帝

    无限流,爽到起飞,这是一个杀戮皇帝,万界大战争
  • 奇无道

    奇无道

    作者无能......请看正文......
  • 黎明刻图

    黎明刻图

    经过了千余年的末法时代,地球终于迎来了第二春。道法自然,科技传薪。超自然与科技的结合,开启了地球新时代。这个时代叫“黎明”当我手持刻刀将所有敌人都做成木偶,黎明也会结束。
  • 哪位仙子又搞事

    哪位仙子又搞事

    一场离奇诡案,百年真相浮现。以为解开,不想又是一场暗流涌动。
  • 快穿之宿主大人又不干了

    快穿之宿主大人又不干了

    我艹,别人穿越是那样式儿的,而我穿越是这样式儿的,系统你给老娘出来,保证揍不哭你。“那个系统啊,现在买个人身保险还来得及吗?”“你所呼叫的系统不在服务区,请稍后再呼叫。”
  • 火影之影神降临

    火影之影神降临

    奈良幽冥重生火影世界,获得霸王系统。主宰火影世界……
  • 十刃一一地下城

    十刃一一地下城

    神秘楼兰古城连发诡异命案……十个因动漫《死神》相识相知于网络的青年,决定集体楼兰探险……他们都有着沉重的过往,却也各怀绝技,深藏不露……一路上猜忌、内讧、神秘势力、奇蛊异毒始终侵扰着他们……然而在经历种种艰辛以后,他们找到的却只有……
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 三生三世有幸相识

    三生三世有幸相识

    第一世她是雪山初醒的懵懂少女,他是白衣飘飘的救命恩人,一世纠缠未得善果。第二世她是家世显赫的名门闺秀,他是寒窗苦读的有志少年,两世情缘未得善终。第三世她是雍容华贵的当朝贵妃,他是高高在上的当朝帝王,三生有幸两看相厌。