Python中的OOP其实就是在已连接命名空间对象内寻找属性而已。
类名大写!尽量
类内部的方法,通常添加一个单一下划线的前缀。
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 ...
如果没有这样的调用,子类会完全取代超类的构造函数。
可以分别使用特殊的类语法来实现/定义抽象基类:
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中的多态是基于对象接口的。
如果通过参数列表进行重载方法,如:
class C: def method(self, x): ... def method(self, x, y, z): ...
这样的代码是会执行的,但是,只有最后一个定义才会起作用(就像X=1,然后X=2,结果X将是2)
class语句内开头有两个下划线,但结尾没有两个下划线的变量名,会自动扩张,从而包含了所在类的名称。
例如,像Spam类内__X这样的变量名会自动编程_Spam__X; 原始的变量名会在头部加入一个下划线,然后是所在类名称。
可以避免多重继承时可能导致的命名冲突。用的不多。
在class语句内,首行括号内可以列出一个以上的类。当这么做时,就是在使用所谓的多重继承:类和其实例继承了列出的所有超类的变量名。