Python中的类提供了面向对象变成的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中调用类的同名方法。以下是本文将要学习的内容:
类的定义
定义类的语法格式如下:
1 class ClassName: 2 <statement-1> 3 ... 4 <statement-N>
类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。例如,定义一个学生类 Student。
1 class Student(): 2 def info(self): 3 print("测试方法")
类对象
类对象支持两种操作:属性引用和实例化。属性引用使用Python中所有的属性引用一样的标准语法:obj.name。类对象创建后,类命名空间中所有的命名都是有效属性。所以,如果类定义为:
1 class MyClass: 2 """一个简单的类实例""" 3 i = 12345 4 def f(self): 5 return "hello world" 6 7 # 实例化类 8 x = MyClass() 9 # 访问类的属性和方法 10 print("MyClass类的属性i为:", x.i) 11 print("MyClass类的方法f输出为:", x.f())
以上创建了一个新的实例并将该对象赋给局部变量x, x为空的对象。
运行后控制台会输出:
MyClass类的属性i为: 12345
MyClass类的方法f输出为: hello world
类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用,具体如下:
1 def __init__(self): 2 self.data = []
类定义了 __init__() 方法,类的实例化操作会自动调用 __init__() 方法。如下列实例化MyClass对应的__init__方法就会被调用。
x = MyClass()
当然, __init__() 方法可以有参数,参数通过 __init__() 传递到实例化操作上。例如:
1 class Complex: 2 def __init__(self, realpart , imagpart): 3 self.r = realpart 4 self.i = imagpart 5 x = Complex(3.0 , -4.5) 6 print(x.r , x.i) # 输出结果: 3.0 -4.5
self代表类的实例,而非类,类的方法与普通的函数只有一个特别的区别——它们必须由一个额外的参数名称,按照惯例她的名称是self。
类方法
在类的内部,使用def关键字来定义一个方法,与一般的函数定义不同,类的方法必须包含参数self,且为第一个参数,self代表的是累的实例。
1 # 类定义 2 class people: 3 # 定义基本属性 4 name = '' 5 age = 0 6 # 定义私有属性,私有属性在类外部无法直接访问 7 __weight = 0 8 # 定义构造方法w 9 def __init__(self , n , a ,w): 10 self.name = n 11 self.age = a 12 self.__weight = w 13 def speak(self): 14 print("%s说:我%d岁"%(self.name , self.age)) 15 16 # 实例化类 17 p = people('runoob' , 10 ,30) 18 p.speak()
运行后控制台输出: runoob说:我10岁
继承
Python同样支持类的继承——如果一种语言不支持继承,类就没有什么意义。派生类的定义如下:
1 class DeriedClassName(BaseClassName1): 2 <statement-1> 3 ... 4 <statement-N>
需要注意的是,圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,Python从左到右搜索,即方法在子类中未找到,从左到右查找基类中是否包含该方法。
BaseClassName1(示例中基类名)必须与派生类定义在一个作用域内。除了类外,还可以用表达式,当基类定义在另一个模块中时这一点非常有用。
class DeriedClassName(modname.BaseClassName):
示例如下:
1 # 类定义 2 class people: 3 # 定义基本属性 4 name = '' 5 age = 0 6 # 定义私有属性,私有属性在类外部无法直接访问 7 __weight = 0 8 # 定义构造方法w 9 def __init__(self , n , a ,w): 10 self.name = n 11 self.age = a 12 self.__weight = w 13 def speak(self): 14 print("%s说:我%d岁"%(self.name , self.age)) 15 16 # 单继承示例 17 class student(people): 18 grade = '' 19 def __init__(self , n , a, w ,g): 20 # 调用基类的构造函数 21 people.__init__(self, n, a ,w ) 22 self.grade = g 23 # 覆盖基类的方法 24 def speak(self): 25 print("%s说:我%d岁了,我在读%d年级" % (self.name, self.age , self.grade)) 26 27 # 实例化类 28 s = student('runoob',10,60,3) 29 s.speak()
运行后控制台输出: runoob说:我10岁了,我在读3年级 。