爬虫与Python:(二)Python基础篇——13.类

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年级

posted @ 2021-10-08 21:36  陆陆无为而治者  阅读(64)  评论(0编辑  收藏  举报