在类定义时,self和__init__会时常用到。
self 参数,它在所有的方法声明中都存在。它代表实例对象本身,当你用实例调用方法时,由解释器悄悄地传递给方法的,所以,你不需要自己传递self 进来,因为它是自动传入的。
- class Sample(object):
- def __init__(self, a,b):
- self.a = a
- self.b = b
- def updtFunc(self, a):
- self.a = a
- return self.a, self.b
- item = Sample(10,3)
- print item.addFunc(4)
out put:
(3,4)
self 变量用于在类实例方法中引用方法所绑定的实例。
因为方法的实例在任何方法调用中总是
作为第一个参数传递的,self 被选中用来代表实例。你必须在方法声明中放上self(你可能已经注
意到了这点),但可以在方法中不使用实例(self)。
如果你的方法中没有用到self , 那么请考虑创建
一个常规函数,除非你有特别的原因。
毕竟,你的方法代码没有使用实例,没有与类关联其功能,
这使得它看起来更像一个常规函数。在其它面向对象语言中,self 可能被称为 this。
__init__:
在Python 中,__init__()实际上不是一个构造器。你没有调用“new”来创建一个新对象。(Python 根本就没有“new”关键字)。取而代之,Python 创建实例后,在实例化过程中,调用__init__()方法,当一个类被实例化时,就可以定义额外的行为,比如,设定初始值或者运行一些初步诊断代码 ———主要是在实例被创建后,实例化调用返回这个实例之前,去执行某些特定的任务或设置。
__init__()在实例化时被调用,即,在Sample()被调用时。你可以认为实例化是对__init__()的一种隐式的调用,因为传给Sample()的参数完全与__init__()接收到的参数是一样的(除了self,它是自动传递的)。
另外,如果不存在默认的参数,那么传给__init__()的两个参数在实例化时是必须的。
当def __init__(self, a = 0, b = 0)时, 我们可以只用item = Sample()来生成实例。
当类被调用,实例化的第一步是创建实例对象。一旦对象创建了,Python 检查是否实现了
__init__()方法。默认情况下,如果没有定义(或覆盖)特殊方法__init__(),对实例不会施加任
何特别的操作.任何所需的特定操作,都需要程序员实现__init__(),覆盖它的默认行为。如果
__init__()没有实现,则返回它的对象,实例化过程完毕。
然而,如果__init__()已经被实现,那么它将被调用,实例对象作为第一个参数(self)被传递
进去,像标准方法调用一样。调用类时,传进的任何参数都交给了__init__()。实际中,你可以想
像成这样:把创建实例的调用当成是对构造器的调用。
class EmplAddrBookEntry(AddrBookEntry):
'Employee Address Book Entry class'#员工地址本类
def __init__(self, nm, ph, id, em):
AddrBookEntry.__init__(self, nm, ph)
self.empid = id
self.email = em
如 果需要,每个子类最好定义它自己的构造器,不然,基类的构造器会被调用。然而,如果子类重写基类的构造器,基类的构造器就不会被自动调用了--这样,基类 的构造器就必须显式写出才会被执行,像我们上面那样,用AddrBookEntry.__init__()设置名字和电话号码。我们的子类在构造器后面几 行还设置了另外两个实例属性:员工ID 和E-mail 地址。
核心笔记:命名类、属性和方法
类名通常由大写字母打头。这是标准惯例,可以帮助你识别类,特别是在实例化过程中(有时看
起来像函数调用)。还有,数据属性(译者注:变量或常量)听起来应当是数据值的名字,方法名应
当指出对应对象或值的行为。另一种表达方式是:数据值应该使用名词作为名字,方法使用谓词(动
词加对象)。数据项是操作的对象、方法应当表明程序员想要在对象进行什么操作。在上面我们定义
的类中,遵循了这样的方针,数据值像“name”,“phone”和“email”,行为如“updatePhone”,
“updateEmail”。这就是常说的“混合记法(mixedCase)”或“骆驼记法(camelCase)”。Python 规
范推荐使用骆驼记法的下划线方式,比如,“update_phone”,“update_email”。类也要细致命名,
像“AddrBookEntry”,“RepairShop”等等就是很好的名字。