06-Python类和对象

类和对象

和其它编程语言相比,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__称方
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值