python中str, list 还有 dict 都是某种意义上的类 (class),只不过是内置的而已。如前所述,dir() 可以列出类和对象的方法 (method)。
class 和 self
和 c++ 一样,python 也用 class 定义一个类:
class 类名称:
"类的文档字串,用来简单说明这个类"
成员变量
def __int__ (self, 参数): # [可选] 类似构造函数,但 __init__ 被(自动)调用时,对象已然被创建出来了
函数体
def __del__ (self): # [可选] 类似析构
函数体
def 成员函数 (self, 参数):
函数体
习惯上,和 c++ 不同的是,python 一般使用 self (是一种习惯而非强制,在 def 的时候可以使用其他的名字比如 this)而不是 this,但两者功能上类似,值得注意的是,self 需要在方法的参数中写定,并且引用成员变量的时候,一定要通过 self。比如:
class Person:
"store information of a person"
name = ''
age = 0
sex = 'male'
def textOut(self): # 这个 self 不可少
print 'name is: ', self.name, ' age is ', self.age, ' and sex is ', self.sex # 对成员变量的引用,亦必须通过 self
@staticmethod
def sayHello ():
print 'hello,world!'
p = Person()
p.textOut()
p.sayHello()
Person.sayHello()
如果成员函数不带 self 参数,则类似 c++ 中静态函数的概念,不能访问成员变量,但是需要在函数前面加 @staticmethod 修饰 (独占一行),静态方法可以通过对象调用,亦可以通过类名调用。如上。
另外需要注意的是很多以两个下划线开头和结尾的函数(专用方法),这些往往都有特殊用途,比如上面提到的 __init__ 和 __del__,还有 __add__, __eq__, __ge__, __gt__, __lt__, __le__, __ne__, __getitem__, __str__ 等等。比如 __getitem__ 用来实现 [] 操作,而 __str__ 用来实现 str() 操作,等等。
继承
python 通过这样的语法形式来实现继承:
class Derived (Base1[, Base2[, …]]]):
类实现
可以有多个逗号分割开的基类,用以实现多继承。这里有两个细节要注意:
如果定义了 __init__ 函数,那么必须在 __init__ 中调用基类的 __init__,方法为 基类名.__init__(self[, 其他参数])
调用基类的函数,务必手工添加 self 参数
一个例子:
class Namable:
name = ''
def __init__ (self, name):
self.name = name
def output (self):
print 'name is:', self.name
class Agable:
age = 0
def __init__ (self, age):
self.age = age
def output (self):
print 'age is:', self.age
class Person (Namable, Agable):
sex = 'male'
def __init__ (self, name, age, sex = 'male'):
Namable.__init__(self, name) # 显式调用基类的 __init__,带 self 参数
Agable.__init__(self, age)
self.sex = sex
def output (self):
Namable.output(self) # 调用基类的函数,亦需要带上 self 参数
Agable.output(self)
print 'sex is:', self.sex
def do_output (self):
self.output() # 非基类函数,则无需手工加上 self 参数
p = Person('doudehou', 32)
p.do_output()