一、类
1、类定义
所有类必须继承至少一个父类,如果类没有继承任何其他父类,object将作为默认的父类。object是所有类之母。
eg1: 类仅作为容器对象来共享名字空间
class MyData(object):
pass
>>> from MyData import *
>>> mathObj = MyData() # 把类作为名称空间容器
>>> mathObj.x = 4 # mathObj.x 和 mathObj.y是实例对象的独有属性,不是类MyData的属性。这些属性是动态的,不需要在任何地方预先声明或者赋值。
>>> mathObj.y = 5
>>> mathObj.x + mathObj.y
9
>>> mathObj.x * mathObj.y
20
eg2: 定义一个包含方法的类
class AddrBookEntry(object):
"address book entry class"
def __init__(self, nm, ph):
self.name = nm
self.phone = ph
print("Created instance for:", self.name)
def updatePhone(self, newph):
self.phone = newph
print("Updated phone# for:", self.name)
>>> john = AddrBookEntry('John Doe', '77665544') # 创建实例
Created instance for: John Doe
>>> jane = AddrBookEntry('Jane Doe', '11223344') # 创建实例
Created instance for: Jane Doe
>>> john
<MyData.AddrBookEntry object at 0x00AD5E30>
>>> john.name # 访问实例属性
'John Doe'
>>> john.phone
'77665544'
>>> john.updatePhone('87665544') # 方法调用(通过实例)
Updated phone# for: John Doe
>>> john.phone
'87665544'
eg3: 定义子类
class EmplAddrBookEntry(AddrBookEntry):
"""Employee Address Book Entry class"""
def __init__(self, nm, ph, id, em): # 如果需要,每个子类最好定义自己的构造器,否则,基类的构造器会被调用
AddrBookEntry.__init__(self, nm, ph) # 如果子类重写基类的构造器,需要显式调用基类的构造器。
self.empid = id # 显式传递self实例对象给基类构造器,因为我们不是在该实例中,而是在一个子类实例中调用那个方法
self.email = em # 调用非绑定方法
def updateEmail(self, newem):
self.email = newem
print("Update e-mail address for:", self.name)
>>> john = EmplAddrBookEntry('John Doe', '77665544', '28', 'jone@qq.com')
Created instance for: John Doe
>>> john.name
'John Doe'
>>> john.updatePhone(87665544) # 调用父类的方法updatePhone()更新电话号码
Updated phone# for: John Doe
>>> john.phone
87665544
>>> john.updateEmail('john@126.com') # 调用子类的方法updateEmail()
Update e-mail address for: John Doe
>>> john.email
'john@126.com'
2、方法
方法定义在类定义中,但只能被实例所调用。也就是说:
(1)定义类和方法
(2)创建一个实例
(3)用这个实例调用方法
参数self在所有的方法声明中都存在,这个参数代表实例对象本身。当用实例调用方法时,由解释器悄悄地传递给方法。
一般的方法需要用到这个实例(self),而静态方法和类方法不需要。类方法需要类而不是实例。
class MyDataWithMethod(object): # 定义类
def printFoo(self): # 定义方法
print("You invoked printFoo()!")
>>> myObj = MyDataWithMethod()
>>> myObj.printFoo()
You invoked printFoo()!