本文主要记录了python的面向对象技术。运行环境:macOS 10.12.6
面向对象技术简介
- 类:用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象共有的属性和方法。对象是类的实例。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数.
- 数据成员:类变量或实例变量用于处理类及其实例对象的相关数据。
- 方法重载:如果从父类继承的方法不能满足子类需求,可以对其进行改写,这个过程叫做方法的覆盖(override),重载。
- 实例变量:定义在方法中的变量,只作用于当前实例的类。
- 类变量:在整个实例化的对象中是公用的,类变量定义都在类中且在函数体之外。类变量通常不作为实例变量使用。
- 继承:即一个派生类(derived Class)继承基类(base class)的字段和方法。
类
创建类
使用class语句来创建一个新类,如下实例:1
2
3
4
5
6class ClassName:
'类的帮助信息' #类文档字符串
类变量 #类体 class_suite由类成员、方法、数据属性构成
def __int__(self,paramers): #累的构造方法
def function(self,...)
......
1 | #coding:utf-8 |
python中有三种方法:实例方法,类方法以及静态方法。
实例方法一般以self作为第一个参数,必须和具体的对象实例进行绑定后才可以访问。通过self引用的可能是类属性,也可能是实例属性(根据具体情况分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
类方法以cls作为第一个参数,cls表示类本身,定义时使用@classmethod,那么通过cls引用的必定是类对象的属性和方法。
静态方法不需要默认的任何参数,跟一般的普通函数类似,定义的时候使用@staticmethod。静态方法中不需要额外定义参数,因此在金泰方法中引用类属性的话,必须通过类对象来引用。
访问属性
使用.
来访问对象的属性。
getattr(obj,name[,default]):访问对象属性
hasattr(obj,name):检查是否存在一个属性
setattr(obj,name,value):设置一个属性,如果属性不存在,会创建一个新属性
delattr(obj,name):删除属性
内置类属性
1 | __dict__ :类的属性(包括一个字典,由类的数据熟悉组成) |
python对象销毁
在python内部记录着所有使用中的对象各有多少引用。一个内部跟踪变量,成为一个引用计数器。
当对象呗创建时,就创建了一个引用计数,当这个对象不再需要时,即引用计数变为0时,他被垃圾回收,但是回收不是立即的,由接收器在适当的时机,将垃圾对象占用的内存空间回收。
类的继承
1 | class 派生类名称(基类名) #基类是在类定义的时候,在元组之中指明的 |
python继承的一些特点:
- 在继承中,基类的构造不会被自动调用,需要在其派生类的构造中亲自专门调用
- 在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量,区别于在类中调用普通函数时并不需要带上self参数
- python总是首先找对应类型的方法,如果不能再派生类中找到对应方法,他才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类找)
如果在继承元组中列了一个以上的类,那么他就被称作“多重继承”1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#coding:utf-8
class Parent:
parentAttr = 100
def __init__(self):
print("调用父类构造函数")
def parentMethod(self):
print("调用父类方法")
def setAttr(self,attr):
Parent.parentAttr = attr #类的属性!!
def getAttr(self):
print("父类属性",Parent.parentAttr)
class Child(Parent):
def __init__(self):
Parent()
print("调用子类构造函数")
def childMethod(self):
print("调用子类方法child method")
可以使用issubclass() 或者 isinstance()方法来检测。
issubclass() 布尔函数判断一个雷是另一个类的子类或者子孙类。语法:issubclass(sub,sup)
isinstance(obj,Class) 不二函数如果obj是class类的实例对象或者是一个Class子类的实例对象,则为true
方法重写
如果父类方法功能不能满足需求,可以方法重写1
2
3
4
5
6
7
8
9
10
11
12
13
14#coding:utf-8
class Parent:
parentAttr = 100
def __init__(self):
print("调用父类构造函数")
def parentMethod(self):
print("调用父类方法")
class Child(Parent):
def __init__(self):
Parent()
print("调用子类构造函数")
def parentMethod(self):
print("方法重写")