python 面向对象编程
一. 创建类和对象
1. 创建类及类实例
class TestA:
def func(self):
print("Test A")
obj = TestA() # 类对象指针.
创建类的实例, 根据类创建对象.
2. self :
方法的形式参数, 代指执行方法的对象本身, Python 内部自动传递. 可以在类的方法中打印 self, 做测试.
>> class TestA:
def func(self):
print(id(self))
>> obj = TestA()
>> id(obj)
140366659413584
>> obj.func()
140366659413584
二. oop 特性之 封装
1.封装的使用场景 :
-
当同一类型的方法具有相同的参数时, 直接封装到对象即可.
-
把类当做模板, 创建多个对象或子类, 对象内封装的数据可以不一样.
类在实例化的时候, 携带(封装)其运算所需的数据.
窃以为, 可以将类比作一台加工机器, 类实例化的对象看做原料, 对象可以加工机器的加工方法, 变成产品.
2.特殊方法 :
__init__() : 构造方法, 用于初始化实例.
ClsName() --> 自动化执行类中的 __init__() 方法, 执行两个操作 :
1. 在对象中封装内容;
2. 创建对象.
__del__() : 析构方法, 解释器销毁对象时, 自动调用.
if you don't known what are you doing, do not use it.
三. oop 特性之 继承
1.父类/子类 基类/派生类
派生类可以继承基类中所有的方法;
当派生类与基类同事存在相同的方法时, 优先使用派生类的方法(优先使用自己的方法).
2.单继承 :
class TestA:
def func(self):
return "func"
class TestB(TestA):
def func_a(self):
return 'new func'
* TestB 从 TestA 中继承了 func 方法, 同时拥有自己的方法 func_a .
3.多重集成 :
python 的面向对象允许派生类继承多个父类. 这在其他的面向对象编程语言中是不允许的, 如Java, C# 等.
class FatherA:
pass
class FatherB:
pass
class Son(FatherA, FatherB):
pass
多重继承中, 在实例化的对象调用方法时, 有限使用对象方法, 如果没有, 则使用继承的父类的方法.
当调用的方法同时存在于多个父类中时, 方法的寻找顺序: 深度优先原则.
python3 中没有新式类和经典类之分.
4.self 与 继承
示例代码:
class A:
def bar(self):
print("BAR")
self.x()
class B(A):
def x(self):
print("B")
class C:
def x(self):
print("C")
class D(C,B):
pass
d1 = D()
d1.bar() # C
Class A 中的 self.x() 在被 Class D 继承之后, self 在被调用时, 被替换为 Class D 本身, 然后按照 深度优先的原则, 寻找方法. 所以会执行 Class C 中的 x() 方法, 并返回 "C" .
5. 执行父类的构造方法
-
方法一 : 推荐
super(ClassName, self).__init__() # ClassName 为当前类的类名.
-
方法二:
FatherClassName.__init__(self)
6.python2.x
1.新式类 :
class TestA: # 经典类, 深度优先.
pass
2.经典类 :
class TestA(object): # 新式类, 广度优先.
pass
四. oop 特性之 多态
多态, Python 原生多态.
五. 类的成员
类的成员
字段
普通字段
静态字段
方法
普通方法
类方法
静态方法
属性
普通属性
六. 成员修饰符
每一个类的成员都有两种形式 :
共有成员 :
私有成员 :
七. 类的特殊成员
__doc__
__module__ & __class__
__init__
__del__
__call__
__dict__
__str__
__getitem__ , __setitem__, __delitem__
__getslice__, __setslice__, __delslice__
__iter__
__new__ & __metaclass__
八. 扩展 : 在其他面向对象编程语言中的相关概念.
1.重载 : 方法的重载, 函数名相同, 参数个数不同 (python 不支持).
2.重写 : 在派生类中, 重新实现基类中的方法.
3.接口 : interface
当提到接口的时候, 有两类接口 :
-
语言内的接口, 代码级别
Java, C# 有接口一说, 但 python 没有.
interface 也是关键字, 类似于类, 可以定义方法, 但方法中不可以实现任何功能. 其他的类, 可以可以继承 interface, 并且, 只能定义 interface 中定义的方法.
接口是用来约束继承者可以实现的方法的.
-
API 接口, 业务级别.
如 RUSTful 接口等.