Python中的OOP其实就是在已连接命名空间对象内寻找属性而已。
类名大写!尽量
类内部的方法,通常添加一个单一下划线的前缀。
class语句
class语句一般形式:
class <name>(superclass,...):
data = value
def method(self,...):
self.member = value
类方法
方法调用
instance.method(args... ...)
会被自动翻译为一下形式的类方法函数调用
class.method(instance,args... ...)
这两种调用形式在Python中都有效。
构造函数
如果要保证子类的构造函数也会执行超类构造时的逻辑,一般都必须通过类明确调用超类的__init__方法:
class Super:
def __init__(self,x):
...default code...
class Sub(Super):
def __init__(self,x,y):
Super.__init__(self,x)
...custom code ...
如果没有这样的调用,子类会完全取代超类的构造函数。
Python2.6和Python3.0中的抽象超类
可以分别使用特殊的类语法来实现/定义抽象基类:
Python3.0
from abc import ABCMeta,abstractmethod
class Super(metaclass=ABCMeta):
@abstractmethod
def method(self,...):
pass
Python2.6:
class Super:
__metaclass__=ABCMeta
@abstractmethod
def method(self,...):
pass
不管哪种方法,效果都是相同的——我们不能产生一个实例,除非在类树的较低层级定义了该方法。
Python中的多态
因为Python中没有类型声明,所以Python中的多态是基于对象接口的。
如果通过参数列表进行重载方法,如:
class C:
def method(self, x):
...
def method(self, x, y, z):
...
这样的代码是会执行的,但是,只有最后一个定义才会起作用(就像X=1,然后X=2,结果X将是2)
运算符重载
类的伪私有属性/变量名压缩
变量名压缩
class语句内开头有两个下划线,但结尾没有两个下划线的变量名,会自动扩张,从而包含了所在类的名称。
例如,像Spam类内__X这样的变量名会自动编程_Spam__X; 原始的变量名会在头部加入一个下划线,然后是所在类名称。
可以避免多重继承时可能导致的命名冲突。用的不多。
多重继承
在class语句内,首行括号内可以列出一个以上的类。当这么做时,就是在使用所谓的多重继承:类和其实例继承了列出的所有超类的变量名。