类和对象
和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。
Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
对象可以包含任意数量和类型的数据。
类定义
语法格式如下:
class` `ClassName:`` ``<statement``-``1``>`` ``.`` ``.`` ``.`` ``<statement``-``N>
类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。
类对象
类对象支持两种操作:属性引用和实例化。
属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。
类对象创建后,类命名空间中所有的命名都是有效属性名。所以如果类定义是这样:
class` `MyClass:`` ``"""A simple example class"""`` ``i ``=` `12345`` ``def` `f(``self``):`` ``return` `'hello world'
实例化类:
x ``=` `MyClass()
以上创建了一个新的类实例并将该对象赋给局部变量 x,x 为空的对象。
很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 init() 的特殊方法(构造方法),像下面这样:
def` `__init__(``self``):`` ``self``.data ``=` `[]
类定义了 init() 方法的话,类的实例化操作会自动调用 init() 方法。所以在下例中,可以这样创建一个新的实例:
x ``=` `MyClass()
当然, init() 方法可以有参数,参数通过 init() 传递到类的实例化操作上。例如:
>>> ``class` `Complex``:``... ``def` `__init__(``self``, realpart, imagpart):``... ``self``.r ``=` `realpart``... ``self``.i ``=` `imagpart``...``>>> x ``=` `Complex``(``3.0``, ``-``4.5``)``>>> x.r, x.i``(``3.0``, ``-``4.5``)
类的方法
在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数:
#类定义``class` `people:`` ``#定义基本属性`` ``name ``=` `''`` ``age ``=` `0`` ``#定义私有属性,私有属性在类外部无法直接进行访问`` ``__weight ``=` `0`` ``#定义构造方法`` ``def` `__init__(``self``,n,a,w):`` ``self``.name ``=` `n`` ``self``.age ``=` `a`` ``self``.__weight ``=` `w`` ``def` `speak(``self``):`` ``print``(``"%s is speaking: I am %d years old"` `%``(``self``.name,``self``.age))` `p ``=` `people(``'tom'``,``10``,``30``)``p.speak()
继承
Python 同样支持类的继承,如果一种语言不支持继承就,类就没有什么意义。派生类的定义如下所示:
class` `DerivedClassName(BaseClassName1):`` ``<statement``-``1``>`` ``.`` ``.`` ``.`` ``<statement``-``N>
需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找基类中是否包含方法。
BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:
class` `DerivedClassName(modname.BaseClassName):
实例
#单继承示例``class` `student(people):`` ``grade ``=` `''`` ``def` `__init__(``self``,n,a,w,g):`` ``#调用父类的构函`` ``people.__init__(``self``,n,a,w)`` ``self``.grade ``=` `g`` ``#覆写父类的方法`` ``def` `speak(``self``):`` ``print``(``"%s is speaking: I am %d years old,and I am in grade %d"``%``(``self``.name,``self``.age,``self``.grade))` `s ``=` `student(``'ken'``,``20``,``60``,``3``)``s.speak()
多重继承
Python同样有限的支持多继承形式。多继承的类定义形如下例:
class` `DerivedClassName(Base1, Base2, Base3):`` ``<statement``-``1``>`` ``.`` ``.`` ``.`` ``<statement``-``N>
需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
#另一个类,多重继承之前的准备``class` `speaker():`` ``topic ``=` `''`` ``name ``=` `''`` ``def` `__init__(``self``,n,t):`` ``self``.name ``=` `n`` ``self``.topic ``=` `t`` ``def` `speak(``self``):`` ``print``(``"I am %s,I am a speaker!My topic is %s"``%``(``self``.name,``self``.topic))` `#多重继承``class` `sample(speaker,student):`` ``a ``=``''`` ``def` `__init__(``self``,n,a,w,g,t):`` ``student.__init__(``self``,n,a,w,g)`` ``speaker.__init__(``self``,n,t)` `test ``=` `sample(``"Tim"``,``25``,``80``,``4``,``"Python"``)``test.speak()``#方法名同,默认调用的是在括号中排前地父类的方法
类私有方法
__private_method 两个下划线开头,声明该方法为私有方法,不能在类地外部调用。
在类的内部调用slef.__private_methods。
类的专有方法:
- init 构造函数,在生成对象时调用
- del 析构函数,释放对象时使用
- repr 打印,转换
- __setitem__按照索引赋值
- __getitem__按照索引获取值
- __len__获得长度
- __cmp__比较运算
- __call__函数调用
- __add__加运算
- __sub__减运算
- __mul__乘运算
- __div__除运算
- __mod__求余运算
- __pow__称方