Python 类
Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
对象可以包含任意数量和类型的数据。
python类与c++类相似,提供了类的封装,继承、多继承,构造函数、析构函数。
在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object类就是其直接父类。
类定义
类定义语法格式如下:
class ClassName:
<statement-1>
.
.
.
<statement-N>
类对象:创建一个类之后,可以通过类名访问、改变其属性、方法
实例对象:类实例化后,可以使用其属性,可以动态的为实例对象添加属性(类似javascript)而不影响类对象。
类的属性
可以使用点(.)来访问对象的属性
也可以使用以下函数的方式来访问属性:
Python内置类属性
1 class Person:
2 "Person类"
3 def __init__(self, name, age, gender):
4 print('进入Person的初始化')
5 self.name = name
6 self.age = age
7 self.gender = gender
8 print('离开Person的初始化')
9
10 def getName(self):
11 print(self.name)
12
13 p = Person('ice', 18, '男')
14
15 print(p.name) # ice
16 print(p.age) # 18
17 print(p.gender) # 男
18 print(hasattr(p, 'weight')) # False
19 # 为p添加weight属性
20 p.weight = '70kg'
21 print(hasattr(p, 'weight')) # True
22 print(getattr(p, 'name')) # ice
23
24 print(p.__dict__) # {'age': 18, 'gender': '男', 'name': 'ice'}
25 print(Person.__name__) # Person
26 print(Person.__doc__) # Person类
27 print(Person.__dict__) # {'__doc__': 'Person类', '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__init__': <function Person.__init__ at 0x000000000284E950>, 'getName': <function Person.getName at 0x000000000284EA60>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__module__': '__main__'}
28 print(Person.__mro__) # (<class '__main__.Person'>, <class 'object'>)
29 print(Person.__bases__) # (<class 'object'>,)
30 print(Person.__module__) # __main__
类的方法
在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数。
类的专有方法:
__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法,与c++中构造函数类似。只需在自定义的类中重写__init__()方法即可。
1 class Person:
2 def __init__(self, name, age, gender):
3 print('进入Person的初始化')
4 self.name = name
5 self.age = age
6 self.gender = gender
7 print('离开Person的初始化')
8
9 def getName(self):
10 print(self.name)
11
12 # Person实例对象
13 p = Person('ice', 18, '男')
14 print(p.name)
15 print(p.age)
16 print(p.gender)
17 p.getName()
18
19 # 进入Person的初始化
20 # 离开Person的初始化
21 # ice
22 # 18
23 # 男
24 # ice
析构函数 __del__ ,__del__在对象消逝的时候被调用,当对象不再被使用时,__del__方法运行:
类的封装
python通过变量名命名来区分属性和方法的访问权限,默认权限相当于c++和java中的public
类的私有属性: __private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时self.__private_attrs。
类的私有方法:__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods
虽然python不允许实例化的类访问私有数据,但可以使用 object._className__attrName 访问属性。其实python内部私有化的实现只是将attrName属性变为了_className__attrName而已
1 class Demo:
2 __id = 123456
3
4 def getId(self):
5 return self.__id
6
7 temp = Demo()
8 # print(temp.__id) # 报错 AttributeError: 'Demo' object has no attribute '__id'
9 print(temp.getId()) # 123456
10 print(temp._Demo__id) # 123456
类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。
需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
在python中继承中的一些特点:
如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
语法:
派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示:
多态
如果父类方法的功能不能满足需求,可以在子类重写父类的方法。实例对象调用方法时会调用其对应子类的重写后的方法