第8章 面向对象
1 类的定义与使用¶
1.1 类定义¶
Python 使用 class 关键字来定义类。类名的首字母一般使用大写。
1 | class 类名: |
1 | 变量 = 类名() |
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 2 3
@property def value(self): return self.__value
-
可读可修改属性:
1 2 3 4 5 6 7
def __get(self): return self.__value def __set(self, v): self.__value = v value = property(__get, __set)
-
可读可修改可删除属性:
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 子类名(父类名): |