Python面对对象和进阶操作
类
术语说明
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 类变量/静态变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
静态变量
为全类共有的方法,实例对象不可调用,只能通过类名调用。
公有、保护、私有和特殊方法
公有方法的写法:
1
2
3class Test:
def publicMethod(self): # 第一个参数必须是self
...保护方法的写法:
1
2
3class Test:
def _protectedMethod(self): # 保护方法声明最前面必有单“_”
...私有方法和私有属性的写法:
1
2
3
4class Test:
__privateAttribute = 123 # 私有变量的写法,最前面必有“__”
def __privateMethod(self): # 私有方法的写法,最前面必有“__”
...特殊方法和特殊变量的写法:一般数系统定义的名字,如:
__init__()
和__doc__
等1
2
3class Test:
def __specialMethod__(): # 特殊方法一般都是左右各有“__”
...
创建类
1 | class ClassName: |
类继承
继承的语法:
1 | class SubClass(ParentClass1, ParentClass2, ...): |
在python中继承中的一些特点:
- 如果在子类中需要父类的构造方法就需要显式的调用父类的构造方法,或者不重写父类的构造方法
- 在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数
- Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)
如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
子类构造函数的写法:
1 | class Father(object): |
方法重写
当子类继承了父类的方法后,可以在有需要时,对父类的方法重写
。即重新定义同名函数的不同过程。
在Python里面,重写默认是晚绑定,所以不用担心多态问题。
重载操作符
Python 的运算符重载非常方便,只需要重写对应的特殊方法。如:
1 | class Point: |
常见的可重载运算符
一元运算符
二元运算符
比较运算符
类的内置方法
由对象寻找类:
- issubclass(className1, className2):返回布尔类型,判断
className1
是否是className2
的子孙类 - isinstance(obj, Class):返回布尔类型,判断
obj
是否为Class
的实例 - type(obj):返回一个
type
对象,描述的是obj
的类
对对象和类的属性进行操作:
hasattr(obj, str):返回布尔对象,判断
obj
中是否有某个属性(obj
可以是类或者对象,以下同理);str
是描述这个属性的名字字符串defattr(obj, str):参数解释同上。删除
obj
中的str
setattr(obj, str, newAttr):参数解释同上。用新的属性
newAttr
替换str
所描述的属性。变量和函数都可以换getattr(obj, str):参数解释同上。如果该属性是变量,则获得变量;如果该属性是一个函数,则可以通过在后面加
()
来调用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22class Test:
def __init__(self, name):
self.name = name
def out(self, sth):
print(self.name + " is " + sth)
t = Test('test')
getattr(t, 'out')('a test')
def show():
print('new func')
setattr(t, 'out', show)
getattr(t, 'out')()
# 结果是:
# test is a test
# new func
类的内置属性
__dict__
: 类的属性(包含一个字典,由类的数据属性组成)__doc__
:类的文档字符串__name__
: 类名__module__
: 类定义所在的模块(类的全名是__main__.className
,如果类位于一个导入模块mymod
中,那么className.__module__
等于mymod
)__bases__
: 类的所有父类构成元素(包含了一个由所有父类组成的元组)
正则表示
正则表达式是一个__特殊的字符序列__,它能帮助你方便的__检查一个字符串是否与某种模式匹配__。
可以理解为匹配符合某种模式的字符串。
工具包——re模块
Python标准库里面的模块。提供多种处理字符串以及正则表达式的处理手段可以用各种方法
来对其操作。
正则
网络连接
使用标准库——socket包