Python之类

来源:互联网 发布:元启发式算法 编辑:程序博客网 时间:2024/06/15 08:29

面相对象编程是最有效的的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,你定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。使用面向对象编程可模拟现实情境,其逼真程度达到了令你惊讶的地步。

创建和实用类

使用类几乎可以模拟任何东西。下面来编写一个表示小狗的简单类Dog——它表示的不是特定的小狗,而是任何小狗。对于大多数宠物狗,我们都知道些什么呢?名字、年龄、会蹲下以及打滚。
创建Dog类
dog.py

class Dog():      #类的首写字母要大写                  #self形参必不可少,它是一个指向实例本身的引用    def __init__(self,name,age):   #开头和末尾有两个下划线        self.name = name #以self为前缀的变量都可供类中的所有方法使用,我们可以通过类的任何实例来访问这些变量        self.age  = age    def sit(self):        #模拟小狗蹲下        print(self.name.title()+" is now sitting.")    def roll_over(self):        #模拟小狗打盹        print(self.name.title()+" rolled over!")

根据类创建实例

下面来创建一个表示特定小狗的实例;

class Dog():        ---snip----my_dog = Dog('Jack',8)my_dog.sit()my_dog.roll_over()print("小狗的年龄:"+str(my_dog.age))

输出结果:

这里写图片描述

修改属性的值

直接修改属性的值

要修改属性的值,最简单的方式是通过实例直接修改它。
例如:

class Dog():        ---snip----my_dog = Dog('Jack',8)my_dog.sit()my_dog.roll_over()print("小狗的年龄:"+str(my_dog.age))my_dog.age = 9print("小狗的年龄:"+str(my_dog.age))

输出结果:

这里写图片描述

通过方法修改属性的值

如果有替你更新属性的方法,将大有裨益。这样你无需直接访问属性,而可将值传递给一个方法,由它在内部进行更新。
例如:

class Dog():        ---snip----    def update_age(self,modify_age):        self.age = modify_agemy_dog = Dog('Jack',8)my_dog.sit()my_dog.roll_over()print("小狗的年龄:"+str(my_dog.age))my_dog.update_age(9)print("小狗的年龄:"+str(my_dog.age))

输出结果:

这里写图片描述

继承

编写类时,并非总是要从将空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法,同时还可以定义自己的属性和方法。

子类的方法_init_()

创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法_init_()需要父类施以援手。
例如,基于以上的案例,模拟黑色的小狗,它具备小狗所有的功能:

class Dog():        ---snip----class BlackDog(Dog):    #黑色小狗的独特之处    def __init__(self,name,age):        super().__init__(name,age)        self.color = 'black'my_dog = BlackDog('Jack',8)my_dog.sit()my_dog.roll_over()print("小狗的年龄:"+str(my_dog.age))my_dog.update_age(9)print("小狗的年龄:"+str(my_dog.age))print("小狗的颜色:"+my_dog.color)

输出结果:

这里写图片描述

重写父类的方法

对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法。而只关注你在子类中定义的相应的方法
假如,黑色的狗不会蹲下

class Dog():        ---snip----class BlackDog(Dog):    #黑色小狗的独特之处    def __init__(self,name,age):        super().__init__(name,age)        self.color = 'black'    def sit(self):        print("黑色的狗不会蹲下")my_dog = BlackDog('Jack',8)my_dog.sit()

输出结果:

这里写图片描述

导入类

随着你不断地给类添加功能,文件可能变得很长,即便你妥善地使用了继承亦如此。为遵循Python的总体理念,应该让文件尽可能整洁。为在这方面提供帮助,Python允许你将类存储在模块中,然后再主程序中导入所需要的模块。

导入单个类

首先定义一个Dog类,该类包含dog属性和方法(行为)。

class Dog():      #类的首写字母要大写    #self形参必不可少,它是一个指向实例本身的引用    def __init__(self,name,age):    #开头和末尾有两个下划线        self.name = name     #以self为前缀的变量都可供类中的所有方法使用,我们可以通过类的任何实例来访问这些变量        self.age  = age    def sit(self):        #模拟小狗蹲下        print(self.name.title()+" is now sitting.")    def roll_over(self):        #模拟小狗打盹        print(self.name.title()+" rolled over!")    def update_age(self,modify_age):        self.age = modify_age

下面创建一个my_dog.py,使其导入Dog类并创建实例

from dog import Dogmy_dog = Dog('Jack',8)my_dog.sit()my_dog.roll_over()print("小狗的年龄:"+str(my_dog.age))my_dog.update_age(9)print("小狗的年龄:"+str(my_dog.age))

输出结果:

这里写图片描述

注意:
可以从一个模块导入多个类

from dog import Dog,BlackDog

也可以导入整个模块

from dog

Python标准库

Python标准库是一组模块,安装Python都包含它。你现在对类的工作原理已有大致了解,可以使用其他程序员编写的模块了。
字典让你能够将信息关联起来,但他们不记录你添加键-值对的顺序。要创建字典并记录其中的键-值对的添加顺序,可使用模块collections中的OrderdDict类。
例如:

from collections import OrderedDictfavorite_languges = OrderedDict()favorite_languges['苏林东'] = 'Python'favorite_languges['程菲']   = 'C'favorite_languges['杨明']   = 'C++'for name,value in favorite_languges.items():print(name.title()+"最喜欢的编程语言:"+value.title()+'.')

输出结果:

这里写图片描述

0 0
原创粉丝点击