跳转至

第8章 面向对象

1 类的定义与使用

1.1 类定义

Python 使用 class 关键字来定义类。类名的首字母一般使用大写。

1
    class 类名:
定义了类之后,可以用来实例化对象,并通过“对象名.成员”的方式来访问其中的数据成员或方法。实例化对象如下:
1
    变量 = 类名()
可以使用内置方法 isinstance() 测试一个对象是否为某个类的实例。最后,Python 提供一个 pass 关键字,类似于空语句,可以用在类和函数的定义中或选择结果中。当暂时没有确定如果实现功能,或为以后的软件升级预留空间时,可以使用该关键字来“占位”。

1.2 self 参数

类的所有实例方法都必须至少有一个名为 self 的参数,并且必须是方法的第一个形参,self 参数表示对象本身。在类的实例方法中访问实例属性时需要以 self 为前缀,但在外部通过对象名调用对象时并不需要传递这个参数。

1.3 类成员和实例成员

这里主要指数据成员,或者广义上的属性。可以说属性有两种:实例属性和类属性。实例属性一般是指在构造函数 init() 中定义的,定义和使用必须使用 self 作为前缀;类属性是在类中所有方法之外定义的数据成员。实例属性属于实例(对象),只能通过对象名访问;而类属性属于类,可以通过类名或对象名访问。

1.4 私有成员和公有成员

在定义类属性时,如果属性名以两个下划线“__”开头则表示是私有属性。私有属性在类的外部不能直接访问,需要通过调用对象的公有成员方法来访问。

在 Python 中,以下划线开头的变量名或方法名有特殊含义,尤其是在类的定义中,用下划线作为变量名和方法名前缀和后缀来表示类的特殊成员: (1)_xxx:这样的对象叫做保护成员,不能用“from module import *”导入,只有类对象和子类对象能访问这些成员。 (2)xxx:系统定义的特殊成员。 (3)__xxx:类中的私有成员,只有类对象自己能访问,子类对象也不能访问

2 方法

在类中定义的方法可以粗略分为四大类:公有方法、私有方法、静态方法和类方法。其中,公有方法和私有方法属于对象,私有方法的名字以两个下划线“__”开始。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
    类方法:
    @classmethod
    def 方法名(cls):
        方法体
    一般将 cls 作为类方法的第一个参数名称,并且在调用类方法时不需要为该参数传递值。

    静态方法:
    @staticmethod
    def 方法名():
        方法体

3 属性

定义类和属性:

1
2
3
class Test:
    def __init__(self, value):
        self.__value = value

  1. 只读属性:

    1
    2
    3
    @property
    def value(self):
        return self.__value
    

  2. 可读可修改属性:

    1
    2
    3
    4
    5
    6
    7
    def __get(self):
        return self.__value
    
    def __set(self, v):
        self.__value = v
    
    value = property(__get, __set)
    

  3. 可读可修改可删除属性:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    def __get(self):
        return self.__value
    
    def __set(self, v):
        self.__value = v
    
    def __del(self):
        del del self.__value
    
    value = property(__get, __set, __del)
    

4 继承

派生类可以继承父类的公有成员,但不能继承其私有成员。如果需要在派生类中调用父类的方法,可以使用内置函数 super() 或通过“父类名.方法名()”的方式来实现。继承语法如下:

1
    class 子类名(父类名):